So far we've been relying on sockopt(SOL_IP, IP_FREEBIND) being usable even on IPv6 sockets. However, it turns out it is perfectly reasonable to want to set freebind on an AF_INET6 SOCK_RAW socket - but there is no way to set any SOL_IP socket option on such a socket (they're all blindly errored out). One use case for this is to allow spoofing src ip on a raw socket via sendmsg cmsg. Tested: built, and booted # python >>> import socket >>> SOL_IP = socket.SOL_IP >>> SOL_IPV6 = socket.IPPROTO_IPV6 >>> IP_FREEBIND = 15 >>> IPV6_FREEBIND = 78 >>> s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, 0) >>> s.getsockopt(SOL_IP, IP_FREEBIND) 0 >>> s.getsockopt(SOL_IPV6, IPV6_FREEBIND) 0 >>> s.setsockopt(SOL_IPV6, IPV6_FREEBIND, 1) >>> s.getsockopt(SOL_IP, IP_FREEBIND) 1 >>> s.getsockopt(SOL_IPV6, IPV6_FREEBIND) 1
Showing the changes to include/uapi/linux (1 of 2 files). Show all
Unified · Split
| @@ -284,6 +284,7 @@ struct in6_flowlabel_req { · 283 unmodified lines | ||
| 284 | 284 | #define IPV6_TRANSPARENT 75 |
| 285 | 285 | #define IPV6_UNICAST_IF 76 |
| 286 | 286 | #define IPV6_RECVFRAGSIZE 77 |
| 287 | +#define IPV6_FREEBIND 78 | |
| 287 | 288 | |
| 288 | 289 | /* |
| 289 | 290 | * Multicast Routing: |