Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: Facility to report route quality of connected sockets

This patch add the SO_CNX_ADVICE socket option (setsockopt only). The
purpose is to allow an application to give feedback to the kernel about
the quality of the network path for a connected socket. The value
argument indicates the type of quality report. For this initial patch
the only supported advice is a value of 1 which indicates "bad path,
please reroute"-- the action taken by the kernel is to call
dst_negative_advice which will attempt to choose a different ECMP route,
reset the TX hash for flow label and UDP source port in encapsulation,
etc.

This facility should be useful for connected UDP sockets where only the
application can provide any feedback about path quality. It could also
be useful for TCP applications that have additional knowledge about the
path outside of the normal TCP control loop.

Signed-off-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Tom Herbert and committed by
David S. Miller
a87cb3e4 f1705ec1

+30
+2
arch/alpha/include/uapi/asm/socket.h
··· 95 95 #define SO_ATTACH_REUSEPORT_CBPF 51 96 96 #define SO_ATTACH_REUSEPORT_EBPF 52 97 97 98 + #define SO_CNX_ADVICE 53 99 + 98 100 #endif /* _UAPI_ASM_SOCKET_H */
+2
arch/avr32/include/uapi/asm/socket.h
··· 88 88 #define SO_ATTACH_REUSEPORT_CBPF 51 89 89 #define SO_ATTACH_REUSEPORT_EBPF 52 90 90 91 + #define SO_CNX_ADVICE 53 92 + 91 93 #endif /* _UAPI__ASM_AVR32_SOCKET_H */
+2
arch/frv/include/uapi/asm/socket.h
··· 88 88 #define SO_ATTACH_REUSEPORT_CBPF 51 89 89 #define SO_ATTACH_REUSEPORT_EBPF 52 90 90 91 + #define SO_CNX_ADVICE 53 92 + 91 93 #endif /* _ASM_SOCKET_H */ 92 94
+2
arch/ia64/include/uapi/asm/socket.h
··· 97 97 #define SO_ATTACH_REUSEPORT_CBPF 51 98 98 #define SO_ATTACH_REUSEPORT_EBPF 52 99 99 100 + #define SO_CNX_ADVICE 53 101 + 100 102 #endif /* _ASM_IA64_SOCKET_H */
+2
arch/m32r/include/uapi/asm/socket.h
··· 88 88 #define SO_ATTACH_REUSEPORT_CBPF 51 89 89 #define SO_ATTACH_REUSEPORT_EBPF 52 90 90 91 + #define SO_CNX_ADVICE 53 92 + 91 93 #endif /* _ASM_M32R_SOCKET_H */
+2
arch/mips/include/uapi/asm/socket.h
··· 106 106 #define SO_ATTACH_REUSEPORT_CBPF 51 107 107 #define SO_ATTACH_REUSEPORT_EBPF 52 108 108 109 + #define SO_CNX_ADVICE 53 110 + 109 111 #endif /* _UAPI_ASM_SOCKET_H */
+2
arch/mn10300/include/uapi/asm/socket.h
··· 88 88 #define SO_ATTACH_REUSEPORT_CBPF 51 89 89 #define SO_ATTACH_REUSEPORT_EBPF 52 90 90 91 + #define SO_CNX_ADVICE 53 92 + 91 93 #endif /* _ASM_SOCKET_H */
+2
arch/parisc/include/uapi/asm/socket.h
··· 87 87 #define SO_ATTACH_REUSEPORT_CBPF 0x402C 88 88 #define SO_ATTACH_REUSEPORT_EBPF 0x402D 89 89 90 + #define SO_CNX_ADVICE 0x402E 91 + 90 92 #endif /* _UAPI_ASM_SOCKET_H */
+2
arch/powerpc/include/uapi/asm/socket.h
··· 95 95 #define SO_ATTACH_REUSEPORT_CBPF 51 96 96 #define SO_ATTACH_REUSEPORT_EBPF 52 97 97 98 + #define SO_CNX_ADVICE 53 99 + 98 100 #endif /* _ASM_POWERPC_SOCKET_H */
+2
arch/s390/include/uapi/asm/socket.h
··· 94 94 #define SO_ATTACH_REUSEPORT_CBPF 51 95 95 #define SO_ATTACH_REUSEPORT_EBPF 52 96 96 97 + #define SO_CNX_ADVICE 53 98 + 97 99 #endif /* _ASM_SOCKET_H */
+2
arch/sparc/include/uapi/asm/socket.h
··· 84 84 #define SO_ATTACH_REUSEPORT_CBPF 0x0035 85 85 #define SO_ATTACH_REUSEPORT_EBPF 0x0036 86 86 87 + #define SO_CNX_ADVICE 0x0037 88 + 87 89 /* Security levels - as per NRL IPv6 - don't actually do anything */ 88 90 #define SO_SECURITY_AUTHENTICATION 0x5001 89 91 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
+2
arch/xtensa/include/uapi/asm/socket.h
··· 99 99 #define SO_ATTACH_REUSEPORT_CBPF 51 100 100 #define SO_ATTACH_REUSEPORT_EBPF 52 101 101 102 + #define SO_CNX_ADVICE 53 103 + 102 104 #endif /* _XTENSA_SOCKET_H */
+2
include/uapi/asm-generic/socket.h
··· 90 90 #define SO_ATTACH_REUSEPORT_CBPF 51 91 91 #define SO_ATTACH_REUSEPORT_EBPF 52 92 92 93 + #define SO_CNX_ADVICE 53 94 + 93 95 #endif /* __ASM_GENERIC_SOCKET_H */
+4
net/core/sock.c
··· 987 987 sk->sk_incoming_cpu = val; 988 988 break; 989 989 990 + case SO_CNX_ADVICE: 991 + if (val == 1) 992 + dst_negative_advice(sk); 993 + break; 990 994 default: 991 995 ret = -ENOPROTOOPT; 992 996 break;