summaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorMichal Sekletar <msekleta@redhat.com>2014-01-17 17:09:45 +0100
committerDavid S. Miller <davem@davemloft.net>2014-01-18 19:08:58 -0800
commitea02f9411d9faa3553ed09ce0ec9f00ceae9885e (patch)
treec058c0f3060402a8778ed077f7dc092e62fc0958 /net/core
parent41804420586ab41049a14ab7ef04eaa2280b8647 (diff)
downloadlinux-ea02f9411d9faa3553ed09ce0ec9f00ceae9885e.tar.gz
linux-ea02f9411d9faa3553ed09ce0ec9f00ceae9885e.tar.bz2
linux-ea02f9411d9faa3553ed09ce0ec9f00ceae9885e.zip
net: introduce SO_BPF_EXTENSIONS
For user space packet capturing libraries such as libpcap, there's currently only one way to check which BPF extensions are supported by the kernel, that is, commit aa1113d9f85d ("net: filter: return -EINVAL if BPF_S_ANC* operation is not supported"). For querying all extensions at once this might be rather inconvenient. Therefore, this patch introduces a new option which can be used as an argument for getsockopt(), and allows one to obtain information about which BPF extensions are supported by the current kernel. As David Miller suggests, we do not need to define any bits right now and status quo can just return 0 in order to state that this versions supports SKF_AD_PROTOCOL up to SKF_AD_PAY_OFFSET. Later additions to BPF extensions need to add their bits to the bpf_tell_extensions() function, as documented in the comment. Signed-off-by: Michal Sekletar <msekleta@redhat.com> Cc: David Miller <davem@davemloft.net> Reviewed-by: Daniel Borkmann <dborkman@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/sock.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index b3f7ee3008a0..0c127dcdf6a8 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1167,6 +1167,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sock_flag(sk, SOCK_FILTER_LOCKED);
break;
+ case SO_BPF_EXTENSIONS:
+ v.val = bpf_tell_extensions();
+ break;
+
case SO_SELECT_ERR_QUEUE:
v.val = sock_flag(sk, SOCK_SELECT_ERR_QUEUE);
break;