summaryrefslogtreecommitdiffstats
path: root/net/sctp/probe.c
diff options
context:
space:
mode:
authorDaniel Borkmann <dborkman@redhat.com>2013-08-29 18:54:49 +0200
committerDavid S. Miller <davem@davemloft.net>2013-09-03 21:44:11 -0400
commitb1b72076b90d631637497b35e36bc64254df199d (patch)
tree1e07ffae2509e6e53ab2f4f59a2bfdd00707c394 /net/sctp/probe.c
parent3e25c65ed085b361cc91a8f02e028f1158c9f255 (diff)
downloadlinux-stable-b1b72076b90d631637497b35e36bc64254df199d.tar.gz
linux-stable-b1b72076b90d631637497b35e36bc64254df199d.tar.bz2
linux-stable-b1b72076b90d631637497b35e36bc64254df199d.zip
net: sctp: probe: allow more advanced ingress filtering by mark
This is a follow-up commit for commit b1dcdc68b1f4 ("net: tcp_probe: allow more advanced ingress filtering by mark") that allows for advanced SCTP probe module filtering based on skb mark (for a more detailed description and advantages using mark, refer to b1dcdc68b1f4). The current option to filter by a given port is still being preserved. Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/probe.c')
-rw-r--r--net/sctp/probe.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/net/sctp/probe.c b/net/sctp/probe.c
index cd72ae57aff1..53c452efb40b 100644
--- a/net/sctp/probe.c
+++ b/net/sctp/probe.c
@@ -46,6 +46,10 @@ static int port __read_mostly = 0;
MODULE_PARM_DESC(port, "Port to match (0=all)");
module_param(port, int, 0);
+static unsigned int fwmark __read_mostly = 0;
+MODULE_PARM_DESC(fwmark, "skb mark to match (0=no mark)");
+module_param(fwmark, uint, 0);
+
static int bufsize __read_mostly = 64 * 1024;
MODULE_PARM_DESC(bufsize, "Log buffer size (default 64k)");
module_param(bufsize, int, 0);
@@ -129,15 +133,19 @@ static sctp_disposition_t jsctp_sf_eat_sack(struct net *net,
void *arg,
sctp_cmd_seq_t *commands)
{
+ struct sctp_chunk *chunk = arg;
+ struct sk_buff *skb = chunk->skb;
struct sctp_transport *sp;
static __u32 lcwnd = 0;
struct timespec now;
sp = asoc->peer.primary_path;
- if ((full || sp->cwnd != lcwnd) &&
- (!port || asoc->peer.port == port ||
- ep->base.bind_addr.port == port)) {
+ if (((port == 0 && fwmark == 0) ||
+ asoc->peer.port == port ||
+ ep->base.bind_addr.port == port ||
+ (fwmark > 0 && skb->mark == fwmark)) &&
+ (full || sp->cwnd != lcwnd)) {
lcwnd = sp->cwnd;
getnstimeofday(&now);
@@ -198,8 +206,8 @@ static __init int sctpprobe_init(void)
if (ret)
goto remove_proc;
- pr_info("probe registered (port=%d)\n", port);
-
+ pr_info("probe registered (port=%d/fwmark=%u) bufsize=%u\n",
+ port, fwmark, bufsize);
return 0;
remove_proc: