aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Herbert <tom@herbertland.com>2016-02-24 13:02:52 -0500
committerDavid S. Miller <davem@davemloft.net>2016-02-25 22:01:22 -0500
commita87cb3e48ee86d29868d3f59cfb9ce1a8fa63314 (patch)
tree4002824d66c34364f18019c659aa6adaedb9ab27
parentf1705ec197e705b79ea40fe7a2cc5acfa1d3bfac (diff)
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>
-rw-r--r--arch/alpha/include/uapi/asm/socket.h2
-rw-r--r--arch/avr32/include/uapi/asm/socket.h2
-rw-r--r--arch/frv/include/uapi/asm/socket.h2
-rw-r--r--arch/ia64/include/uapi/asm/socket.h2
-rw-r--r--arch/m32r/include/uapi/asm/socket.h2
-rw-r--r--arch/mips/include/uapi/asm/socket.h2
-rw-r--r--arch/mn10300/include/uapi/asm/socket.h2
-rw-r--r--arch/parisc/include/uapi/asm/socket.h2
-rw-r--r--arch/powerpc/include/uapi/asm/socket.h2
-rw-r--r--arch/s390/include/uapi/asm/socket.h2
-rw-r--r--arch/sparc/include/uapi/asm/socket.h2
-rw-r--r--arch/xtensa/include/uapi/asm/socket.h2
-rw-r--r--include/uapi/asm-generic/socket.h2
-rw-r--r--net/core/sock.c4
14 files changed, 30 insertions, 0 deletions
diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h
index c5fb9e6bc3a5..9e46d6e656d9 100644
--- a/arch/alpha/include/uapi/asm/socket.h
+++ b/arch/alpha/include/uapi/asm/socket.h
@@ -95,4 +95,6 @@
95#define SO_ATTACH_REUSEPORT_CBPF 51 95#define SO_ATTACH_REUSEPORT_CBPF 51
96#define SO_ATTACH_REUSEPORT_EBPF 52 96#define SO_ATTACH_REUSEPORT_EBPF 52
97 97
98#define SO_CNX_ADVICE 53
99
98#endif /* _UAPI_ASM_SOCKET_H */ 100#endif /* _UAPI_ASM_SOCKET_H */
diff --git a/arch/avr32/include/uapi/asm/socket.h b/arch/avr32/include/uapi/asm/socket.h
index 9de0796240a0..1fd147f09a38 100644
--- a/arch/avr32/include/uapi/asm/socket.h
+++ b/arch/avr32/include/uapi/asm/socket.h
@@ -88,4 +88,6 @@
88#define SO_ATTACH_REUSEPORT_CBPF 51 88#define SO_ATTACH_REUSEPORT_CBPF 51
89#define SO_ATTACH_REUSEPORT_EBPF 52 89#define SO_ATTACH_REUSEPORT_EBPF 52
90 90
91#define SO_CNX_ADVICE 53
92
91#endif /* _UAPI__ASM_AVR32_SOCKET_H */ 93#endif /* _UAPI__ASM_AVR32_SOCKET_H */
diff --git a/arch/frv/include/uapi/asm/socket.h b/arch/frv/include/uapi/asm/socket.h
index f02e4849ae83..afbc98f02d27 100644
--- a/arch/frv/include/uapi/asm/socket.h
+++ b/arch/frv/include/uapi/asm/socket.h
@@ -88,5 +88,7 @@
88#define SO_ATTACH_REUSEPORT_CBPF 51 88#define SO_ATTACH_REUSEPORT_CBPF 51
89#define SO_ATTACH_REUSEPORT_EBPF 52 89#define SO_ATTACH_REUSEPORT_EBPF 52
90 90
91#define SO_CNX_ADVICE 53
92
91#endif /* _ASM_SOCKET_H */ 93#endif /* _ASM_SOCKET_H */
92 94
diff --git a/arch/ia64/include/uapi/asm/socket.h b/arch/ia64/include/uapi/asm/socket.h
index bce29166de1b..0018fad9039f 100644
--- a/arch/ia64/include/uapi/asm/socket.h
+++ b/arch/ia64/include/uapi/asm/socket.h
@@ -97,4 +97,6 @@
97#define SO_ATTACH_REUSEPORT_CBPF 51 97#define SO_ATTACH_REUSEPORT_CBPF 51
98#define SO_ATTACH_REUSEPORT_EBPF 52 98#define SO_ATTACH_REUSEPORT_EBPF 52
99 99
100#define SO_CNX_ADVICE 53
101
100#endif /* _ASM_IA64_SOCKET_H */ 102#endif /* _ASM_IA64_SOCKET_H */
diff --git a/arch/m32r/include/uapi/asm/socket.h b/arch/m32r/include/uapi/asm/socket.h
index 14aa4a6bccf1..5fe42fc7b6c5 100644
--- a/arch/m32r/include/uapi/asm/socket.h
+++ b/arch/m32r/include/uapi/asm/socket.h
@@ -88,4 +88,6 @@
88#define SO_ATTACH_REUSEPORT_CBPF 51 88#define SO_ATTACH_REUSEPORT_CBPF 51
89#define SO_ATTACH_REUSEPORT_EBPF 52 89#define SO_ATTACH_REUSEPORT_EBPF 52
90 90
91#define SO_CNX_ADVICE 53
92
91#endif /* _ASM_M32R_SOCKET_H */ 93#endif /* _ASM_M32R_SOCKET_H */
diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h
index 5910fe294e93..2027240aafbb 100644
--- a/arch/mips/include/uapi/asm/socket.h
+++ b/arch/mips/include/uapi/asm/socket.h
@@ -106,4 +106,6 @@
106#define SO_ATTACH_REUSEPORT_CBPF 51 106#define SO_ATTACH_REUSEPORT_CBPF 51
107#define SO_ATTACH_REUSEPORT_EBPF 52 107#define SO_ATTACH_REUSEPORT_EBPF 52
108 108
109#define SO_CNX_ADVICE 53
110
109#endif /* _UAPI_ASM_SOCKET_H */ 111#endif /* _UAPI_ASM_SOCKET_H */
diff --git a/arch/mn10300/include/uapi/asm/socket.h b/arch/mn10300/include/uapi/asm/socket.h
index 58b1aa01ab9f..5129f23a9ee1 100644
--- a/arch/mn10300/include/uapi/asm/socket.h
+++ b/arch/mn10300/include/uapi/asm/socket.h
@@ -88,4 +88,6 @@
88#define SO_ATTACH_REUSEPORT_CBPF 51 88#define SO_ATTACH_REUSEPORT_CBPF 51
89#define SO_ATTACH_REUSEPORT_EBPF 52 89#define SO_ATTACH_REUSEPORT_EBPF 52
90 90
91#define SO_CNX_ADVICE 53
92
91#endif /* _ASM_SOCKET_H */ 93#endif /* _ASM_SOCKET_H */
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h
index f9cf1223422c..9c935d717df9 100644
--- a/arch/parisc/include/uapi/asm/socket.h
+++ b/arch/parisc/include/uapi/asm/socket.h
@@ -87,4 +87,6 @@
87#define SO_ATTACH_REUSEPORT_CBPF 0x402C 87#define SO_ATTACH_REUSEPORT_CBPF 0x402C
88#define SO_ATTACH_REUSEPORT_EBPF 0x402D 88#define SO_ATTACH_REUSEPORT_EBPF 0x402D
89 89
90#define SO_CNX_ADVICE 0x402E
91
90#endif /* _UAPI_ASM_SOCKET_H */ 92#endif /* _UAPI_ASM_SOCKET_H */
diff --git a/arch/powerpc/include/uapi/asm/socket.h b/arch/powerpc/include/uapi/asm/socket.h
index dd54f28ecdec..1672e3398270 100644
--- a/arch/powerpc/include/uapi/asm/socket.h
+++ b/arch/powerpc/include/uapi/asm/socket.h
@@ -95,4 +95,6 @@
95#define SO_ATTACH_REUSEPORT_CBPF 51 95#define SO_ATTACH_REUSEPORT_CBPF 51
96#define SO_ATTACH_REUSEPORT_EBPF 52 96#define SO_ATTACH_REUSEPORT_EBPF 52
97 97
98#define SO_CNX_ADVICE 53
99
98#endif /* _ASM_POWERPC_SOCKET_H */ 100#endif /* _ASM_POWERPC_SOCKET_H */
diff --git a/arch/s390/include/uapi/asm/socket.h b/arch/s390/include/uapi/asm/socket.h
index d02e89d14fef..41b51c2f4f1b 100644
--- a/arch/s390/include/uapi/asm/socket.h
+++ b/arch/s390/include/uapi/asm/socket.h
@@ -94,4 +94,6 @@
94#define SO_ATTACH_REUSEPORT_CBPF 51 94#define SO_ATTACH_REUSEPORT_CBPF 51
95#define SO_ATTACH_REUSEPORT_EBPF 52 95#define SO_ATTACH_REUSEPORT_EBPF 52
96 96
97#define SO_CNX_ADVICE 53
98
97#endif /* _ASM_SOCKET_H */ 99#endif /* _ASM_SOCKET_H */
diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h
index d270ee91968e..31aede3af088 100644
--- a/arch/sparc/include/uapi/asm/socket.h
+++ b/arch/sparc/include/uapi/asm/socket.h
@@ -84,6 +84,8 @@
84#define SO_ATTACH_REUSEPORT_CBPF 0x0035 84#define SO_ATTACH_REUSEPORT_CBPF 0x0035
85#define SO_ATTACH_REUSEPORT_EBPF 0x0036 85#define SO_ATTACH_REUSEPORT_EBPF 0x0036
86 86
87#define SO_CNX_ADVICE 0x0037
88
87/* Security levels - as per NRL IPv6 - don't actually do anything */ 89/* Security levels - as per NRL IPv6 - don't actually do anything */
88#define SO_SECURITY_AUTHENTICATION 0x5001 90#define SO_SECURITY_AUTHENTICATION 0x5001
89#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 91#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
diff --git a/arch/xtensa/include/uapi/asm/socket.h b/arch/xtensa/include/uapi/asm/socket.h
index fd3b96d1153f..81435d995e11 100644
--- a/arch/xtensa/include/uapi/asm/socket.h
+++ b/arch/xtensa/include/uapi/asm/socket.h
@@ -99,4 +99,6 @@
99#define SO_ATTACH_REUSEPORT_CBPF 51 99#define SO_ATTACH_REUSEPORT_CBPF 51
100#define SO_ATTACH_REUSEPORT_EBPF 52 100#define SO_ATTACH_REUSEPORT_EBPF 52
101 101
102#define SO_CNX_ADVICE 53
103
102#endif /* _XTENSA_SOCKET_H */ 104#endif /* _XTENSA_SOCKET_H */
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h
index fb8a41668382..67d632f1743d 100644
--- a/include/uapi/asm-generic/socket.h
+++ b/include/uapi/asm-generic/socket.h
@@ -90,4 +90,6 @@
90#define SO_ATTACH_REUSEPORT_CBPF 51 90#define SO_ATTACH_REUSEPORT_CBPF 51
91#define SO_ATTACH_REUSEPORT_EBPF 52 91#define SO_ATTACH_REUSEPORT_EBPF 52
92 92
93#define SO_CNX_ADVICE 53
94
93#endif /* __ASM_GENERIC_SOCKET_H */ 95#endif /* __ASM_GENERIC_SOCKET_H */
diff --git a/net/core/sock.c b/net/core/sock.c
index 46dc8ad7d050..4493ff820c2c 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -987,6 +987,10 @@ set_rcvbuf:
987 sk->sk_incoming_cpu = val; 987 sk->sk_incoming_cpu = val;
988 break; 988 break;
989 989
990 case SO_CNX_ADVICE:
991 if (val == 1)
992 dst_negative_advice(sk);
993 break;
990 default: 994 default:
991 ret = -ENOPROTOOPT; 995 ret = -ENOPROTOOPT;
992 break; 996 break;