From: Ian Molton <hidden> Date: 2011-01-18 16:59:35
From: Alban Crequy <redacted>
Linux Socket Filters can already be successfully attached and detached on unix
sockets with setsockopt(sockfd, SOL_SOCKET, SO_{ATTACH,DETACH}_FILTER, ...).
See: Documentation/networking/filter.txt
But the filter was never used in the unix socket code so it did not work. This
patch uses sk_filter() to filter buffers before delivery.
This short program demonstrates the problem on SOCK_DGRAM.
int main(void) {
int i, j, ret;
int sv[2];
struct pollfd fds[2];
char *message = "Hello world!";
char buffer[64];
struct sock_filter ins[32] = {{0,},};
struct sock_fprog filter;
socketpair(AF_UNIX, SOCK_DGRAM, 0, sv);
for (i = 0 ; i < 2 ; i++) {
fds[i].fd = sv[i];
fds[i].events = POLLIN;
fds[i].revents = 0;
}
for(j = 1 ; j < 13 ; j++) {
/* Set a socket filter to truncate the message */
memset(ins, 0, sizeof(ins));
ins[0].code = BPF_RET|BPF_K;
ins[0].k = j;
filter.len = 1;
filter.filter = ins;
setsockopt(sv[1], SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter));
/* send a message */
send(sv[0], message, strlen(message) + 1, 0);
/* The filter should let the message pass but truncated. */
poll(fds, 2, 0);
/* Receive the truncated message*/
ret = recv(sv[1], buffer, 64, 0);
printf("received %d bytes, expected %d\n", ret, j);
}
for (i = 0 ; i < 2 ; i++)
close(sv[i]);
return 0;
}
Signed-off-by: Alban Crequy <redacted>
Reviewed-by: Ian Molton <redacted>
---
net/unix/af_unix.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
@@ -1475,6 +1475,12 @@ restart:gotoout_free;}+if(sk_filter(other,skb)<0){+/* Toss the packet but do not return any error to the sender */+err=len;+gotoout_free;+}+unix_state_lock(other);err=-EPERM;if(!unix_may_send(sk,other))
From: Eric Dumazet <hidden> Date: 2011-01-18 17:24:42
Le mardi 18 janvier 2011 à 16:39 +0000, Ian Molton a écrit :
From: Alban Crequy <redacted>
Linux Socket Filters can already be successfully attached and detached on unix
sockets with setsockopt(sockfd, SOL_SOCKET, SO_{ATTACH,DETACH}_FILTER, ...).
See: Documentation/networking/filter.txt
But the filter was never used in the unix socket code so it did not work. This
patch uses sk_filter() to filter buffers before delivery.
This short program demonstrates the problem on SOCK_DGRAM.
Any idea on performance cost adding sk_filter() call ?
Hmm, looking at it, I have no idea why sk_filter() needs to block BH.
I'll send a patch to relax this requirement.
From: Alban Crequy <hidden> Date: 2011-01-18 18:04:35
Le Tue, 18 Jan 2011 18:22:41 +0100,
Eric Dumazet [off-list ref] a écrit :
Le mardi 18 janvier 2011 à 16:39 +0000, Ian Molton a écrit :
quoted
From: Alban Crequy <redacted>
Linux Socket Filters can already be successfully attached and
detached on unix sockets with setsockopt(sockfd, SOL_SOCKET,
SO_{ATTACH,DETACH}_FILTER, ....). See:
Documentation/networking/filter.txt
But the filter was never used in the unix socket code so it did not
work. This patch uses sk_filter() to filter buffers before delivery.
This short program demonstrates the problem on SOCK_DGRAM.
By the way, the patch implements socket filters on SOCK_DGRAM and
SOCK_SEQPACKET but not SOCK_STREAM. Socket filters does not make sense
to me when there is no packet boundaries. But if there is a need for
it, the code for SOCK_STREAM could be added easily.
Any idea on performance cost adding sk_filter() call ?
Ian will write a performance test and repost the patch with some stats.
I don't know about the performance cost.
Hmm, looking at it, I have no idea why sk_filter() needs to block BH.
From: Eric Dumazet <hidden> Date: 2011-01-18 20:23:39
Le mardi 18 janvier 2011 à 17:51 +0000, Alban Crequy a écrit :
Le Tue, 18 Jan 2011 18:22:41 +0100,
Eric Dumazet [off-list ref] a écrit :
quoted
Any idea on performance cost adding sk_filter() call ?
Ian will write a performance test and repost the patch with some stats.
I don't know about the performance cost.
Dont spend time on this, it was more a question for myself ;)
Cost should be very small, unless complex filter is used, and I have a
JIT compiler for BPF on x86_64, will post it when net-next-2.6 reopens.
From: David Miller <davem@davemloft.net> Date: 2011-01-19 05:32:56
From: Ian Molton <redacted>
Date: Tue, 18 Jan 2011 16:39:15 +0000
From: Alban Crequy <redacted>
Linux Socket Filters can already be successfully attached and detached on unix
sockets with setsockopt(sockfd, SOL_SOCKET, SO_{ATTACH,DETACH}_FILTER, ...).
See: Documentation/networking/filter.txt
But the filter was never used in the unix socket code so it did not work. This
patch uses sk_filter() to filter buffers before delivery.
This short program demonstrates the problem on SOCK_DGRAM.
...
Signed-off-by: Alban Crequy <redacted>
Reviewed-by: Ian Molton <redacted>