net: sctp: probe: allow more advanced ingress filtering by mark
[firefly-linux-kernel-4.4.55.git] / net / sctp / probe.c
index cd72ae57aff13e9b5f26b3ebba2109480bc0223d..53c452efb40b4ab761a54acc37f8c1333fc73fd7 100644 (file)
@@ -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: