]> git.ipfire.org Git - thirdparty/ipset.git/commitdiff
Backport "netfilter: nfnetlink: add struct nfnl_info and pass it to callbacks"
authorJozsef Kadlecsik <kadlec@netfilter.org>
Thu, 24 Jun 2021 11:24:09 +0000 (13:24 +0200)
committerJozsef Kadlecsik <kadlec@netfilter.org>
Sat, 26 Jun 2021 20:19:28 +0000 (22:19 +0200)
Backport patch "netfilter: nfnetlink: add struct nfnl_info and pass it
to callbacks" from Pablo Neira Ayuso <pablo@netfilter.org>.

Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
configure.ac
kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
kernel/net/netfilter/ipset/ip_set_core.c

index 9aea0049d174bd2a1297f9596a5b068e390c18f9..7bb02c3548d04470f1b9ec4e409ec76cc0e4b6d3 100644 (file)
@@ -796,6 +796,16 @@ else
        AC_SUBST(HAVE_NFNL_MSG_PUT, undef)
 fi
 
+AC_MSG_CHECKING([kernel source for struct nfnl_info in nfnl_callback function])
+if test -f $ksourcedir/include/linux/netfilter/nfnetlink.h && \
+   $AWK '/^struct nfnl_callback /,/^}/' $ksourcedir/include/linux/netfilter/nfnetlink.h | $GREP -q 'struct nfnl_info'; then
+       AC_MSG_RESULT(yes)
+       AC_SUBST(HAVE_NFNL_INFO_IN_NFNL_CALLBACK, define)
+else
+       AC_MSG_RESULT(no)
+       AC_SUBST(HAVE_NFNL_INFO_IN_NFNL_CALLBACK, undef)
+fi
+
 AC_MSG_CHECKING([kernel source for kvzalloc() in mm.h])
 if test -f $ksourcedir/include/linux/mm.h && \
    $GREP -q 'static inline void \*kvzalloc(' $ksourcedir/include/linux/mm.h; then
index 3a8dd9ef9d2a819f3a8208347f484fcf1884c2e1..5f44f637414955ca0664593738aecc3d795a5629 100644 (file)
@@ -63,6 +63,7 @@
 #@HAVE_GFP_KERNEL_ACCOUNT@ HAVE_GFP_KERNEL_ACCOUNT
 #@HAVE_NLA_STRSCPY@ HAVE_NLA_STRSCPY
 #@HAVE_NFNL_MSG_PUT@ HAVE_NFNL_MSG_PUT
+#@HAVE_NFNL_INFO_IN_NFNL_CALLBACK@ HAVE_NFNL_INFO_IN_NFNL_CALLBACK
 
 #ifdef HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H
 #include <linux/module.h>
@@ -349,18 +350,34 @@ static inline int nla_put_in6_addr(struct sk_buff *skb, int attrtype,
 }
 #endif
 
-#ifdef HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS
-#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e)      fn(net, nl, skb, nlh, cda, e)
-#define IPSET_CBFN_AD(fn, net, nl, skb, ad, nlh, cda, e) fn(net, nl, skb, ad, nlh, cda, e)
-#define IPSET_SOCK_NET(net, ctnl)                      net
+#ifdef HAVE_NFNL_INFO_IN_NFNL_CALLBACK
+#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e, i)   fn(skb, i, cda)
+#define IPSET_CBFN_AD(fn, net, nl, skb, ad, nlh, cda, e, i) fn(net, nl, skb, ad, nlh, cda, i)
+#define IPSET_SOCK_NET(n, ctnl, i)                     (i)->net
+#define INFO_NLH(i, n)                                 (i)->nlh
+#define INFO_NET(i, n)                                 (i)->net
+#define INFO_SK(i, n)                                  (i)->sk
+#elif defined(HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS)
+#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e, i)   fn(net, nl, skb, nlh, cda, e)
+#define IPSET_CBFN_AD(fn, net, nl, skb, ad, nlh, cda, e, i) fn(net, nl, skb, ad, nlh, cda, e)
+#define IPSET_SOCK_NET(net, ctnl, i)                   net
+#define INFO_NLH(i, n)                                 n
+#define INFO_NET(i, n)                                 n
+#define INFO_SK(i, n)                                  n
 #elif defined(HAVE_NET_IN_NFNL_CALLBACK_FN)
-#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e)      fn(net, nl, skb, nlh, cda)
-#define IPSET_CBFN_AD(fn, net, nl, skb, ad, nlh, cda, e) fn(net, nl, skb, ad, nlh, cda)
-#define IPSET_SOCK_NET(net, ctnl)                      net
+#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e, i)   fn(net, nl, skb, nlh, cda)
+#define IPSET_CBFN_AD(fn, net, nl, skb, ad, nlh, cda, e, i) fn(net, nl, skb, ad, nlh, cda)
+#define IPSET_SOCK_NET(net, ctnl, i)                   net
+#define INFO_NLH(i, n)                                 n
+#define INFO_NET(i, n)                                 n
+#define INFO_SK(i, n)                                  n
 #else
-#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e)      fn(nl, skb, nlh, cda)
-#define IPSET_CBFN_AD(fn, net, nl, skb, ad, nlh, cda, e) fn(nl, skb, ad, nlh, cda)
-#define IPSET_SOCK_NET(net, ctnl)                      sock_net(ctnl)
+#define IPSET_CBFN(fn, net, nl, skb, nlh, cda, e, i)   fn(nl, skb, nlh, cda)
+#define IPSET_CBFN_AD(fn, net, nl, skb, ad, nlh, cda, e, i) fn(nl, skb, ad, nlh, cda)
+#define IPSET_SOCK_NET(net, ctnl, i)                   sock_net(ctnl)
+#define INFO_NLH(i, n)                                 n
+#define INFO_NET(i, n)                                 n
+#define INFO_SK(i, n)                                  n
 #endif
 
 #ifndef HAVE_TC_SKB_PROTOCOL
@@ -408,6 +425,7 @@ static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type)
 #endif
 
 #ifndef HAVE_NFNL_MSG_PUT
+#include <linux/netfilter/nfnetlink.h>
 static inline void nfnl_fill_hdr(struct nlmsghdr *nlh, u8 family, u8 version,
                                 __be16 res_id)
 {
index 4057dc1ad5f35db69d51bd6086061ff4c8a79ccc..43e6b9c2360968c11816d6c00fa432b4e89cb411 100644 (file)
@@ -1036,7 +1036,8 @@ static int
 IPSET_CBFN(ip_set_none, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
        return -EOPNOTSUPP;
 }
@@ -1045,16 +1046,17 @@ static int
 IPSET_CBFN(ip_set_create, struct net *n, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct net *net = IPSET_SOCK_NET(n, ctnl);
+       struct net *net = IPSET_SOCK_NET(n, ctnl, info);
        struct ip_set_net *inst = ip_set_pernet(net);
        struct ip_set *set, *clash = NULL;
        ip_set_id_t index = IPSET_INVALID_ID;
        struct nlattr *tb[IPSET_ATTR_CREATE_MAX + 1] = {};
        const char *name, *typename;
        u8 family, revision;
-       u32 flags = flag_exist(nlh);
+       u32 flags = flag_exist(INFO_NLH(info, nlh));
        int ret = 0;
 
        if (unlikely(protocol_min_failed(attr) ||
@@ -1105,7 +1107,7 @@ IPSET_CBFN(ip_set_create, struct net *n, struct sock *ctnl,
        /* Set create flags depending on the type revision */
        set->flags |= set->type->create_flags[revision];
 
-       ret = set->type->create(net, set, tb, flags);
+       ret = set->type->create(INFO_NET(info, net), set, tb, flags);
        if (ret != 0)
                goto put_out;
 
@@ -1191,9 +1193,10 @@ static int
 IPSET_CBFN(ip_set_destroy, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct ip_set *s;
        ip_set_id_t i;
        int ret = 0;
@@ -1235,7 +1238,7 @@ IPSET_CBFN(ip_set_destroy, struct net *net, struct sock *ctnl,
                /* Modified by ip_set_destroy() only, which is serialized */
                inst->is_destroyed = false;
        } else {
-               u32 flags = flag_exist(nlh);
+               u32 flags = flag_exist(INFO_NLH(info, nlh));
                s = find_set_and_id(inst, nla_data(attr[IPSET_ATTR_SETNAME]),
                                    &i);
                if (!s) {
@@ -1273,9 +1276,10 @@ static int
 IPSET_CBFN(ip_set_flush, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct ip_set *s;
        ip_set_id_t i;
 
@@ -1314,9 +1318,10 @@ static int
 IPSET_CBFN(ip_set_rename, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct ip_set *set, *s;
        const char *name2;
        ip_set_id_t i;
@@ -1365,9 +1370,10 @@ static int
 IPSET_CBFN(ip_set_swap, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct ip_set *from, *to;
        ip_set_id_t from_id, to_id;
        char from_name[IPSET_MAXNAMELEN];
@@ -1695,7 +1701,8 @@ static int
 IPSET_CBFN(ip_set_dump, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
        if (unlikely(protocol_min_failed(attr)))
                return -IPSET_ERR_PROTOCOL;
@@ -1717,7 +1724,7 @@ IPSET_CBFN(ip_set_dump, struct net *net, struct sock *ctnl,
                        .dump = ip_set_dump_do,
                        .done = ip_set_dump_done,
                };
-               return netlink_dump_start(ctnl, skb, nlh, &c);
+               return netlink_dump_start(INFO_SK(info, ctnl), skb, INFO_NLH(info, nlh), &c);
        }
 #endif
 }
@@ -1796,19 +1803,18 @@ call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set,
        return ret;
 }
 
-static int
-IPSET_CBFN_AD(ip_set_ad, struct net *net, struct sock *ctnl,
-             struct sk_buff *skb,
-             enum ipset_adt adt,
-             const struct nlmsghdr *nlh,
-             const struct nlattr * const attr[],
-             struct netlink_ext_ack *extack)
-{
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+static int IPSET_CBFN_AD(ip_set_ad, struct net *net, struct sock *ctnl,
+               struct sk_buff *skb,
+               enum ipset_adt adt,
+               const struct nlmsghdr *nlh,
+               const struct nlattr * const attr[],
+               struct netlink_ext_ack *extack, const struct nfnl_info *info)
+{
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct ip_set *set;
        struct nlattr *tb[IPSET_ATTR_ADT_MAX + 1] = {};
        const struct nlattr *nla;
-       u32 flags = flag_exist(nlh);
+       u32 flags = flag_exist(INFO_NLH(info, nlh));
        bool use_lineno;
        int ret = 0;
 
@@ -1857,20 +1863,22 @@ static int
 IPSET_CBFN(ip_set_uadd, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       return IPSET_CBFN_AD(ip_set_ad, net, ctnl, skb,
-                            IPSET_ADD, nlh, attr, extack);
+       return IPSET_CBFN_AD(ip_set_ad, INFO_NET(info, net), INFO_SK(info, ctnl), skb,
+                            IPSET_ADD, INFO_NLH(info, nlh), attr, extack, info);
 }
 
 static int
 IPSET_CBFN(ip_set_udel, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       return IPSET_CBFN_AD(ip_set_ad, net, ctnl, skb,
-                            IPSET_DEL, nlh, attr, extack);
+       return IPSET_CBFN_AD(ip_set_ad, INFO_NET(info, net), INFO_SK(info, ctnl), skb,
+                            IPSET_DEL, INFO_NLH(info, nlh), attr, extack, info);
 }
 
 static int
@@ -1878,9 +1886,10 @@ IPSET_CBFN(ip_set_utest, struct net *net, struct sock *ctnl,
           struct sk_buff *skb,
           const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct ip_set *set;
        struct nlattr *tb[IPSET_ATTR_ADT_MAX + 1] = {};
        int ret = 0;
@@ -1916,9 +1925,10 @@ static int
 IPSET_CBFN(ip_set_header, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        const struct ip_set *set;
        struct sk_buff *skb2;
        struct nlmsghdr *nlh2;
@@ -1936,7 +1946,7 @@ IPSET_CBFN(ip_set_header, struct net *net, struct sock *ctnl,
        if (!skb2)
                return -ENOMEM;
 
-       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0,
+       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), INFO_NLH(info, nlh)->nlmsg_seq, 0,
                         IPSET_CMD_HEADER);
        if (!nlh2)
                goto nlmsg_failure;
@@ -1948,7 +1958,8 @@ IPSET_CBFN(ip_set_header, struct net *net, struct sock *ctnl,
                goto nla_put_failure;
        nlmsg_end(skb2, nlh2);
 
-       ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT);
+       ret = netlink_unicast(INFO_SK(info, ctnl), skb2, NETLINK_PORTID(skb),
+                             MSG_DONTWAIT);
        if (ret < 0)
                return ret;
 
@@ -1974,7 +1985,8 @@ static int
 IPSET_CBFN(ip_set_type, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
        struct sk_buff *skb2;
        struct nlmsghdr *nlh2;
@@ -1997,7 +2009,7 @@ IPSET_CBFN(ip_set_type, struct net *net, struct sock *ctnl,
        if (!skb2)
                return -ENOMEM;
 
-       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0,
+       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), INFO_NLH(info, nlh)->nlmsg_seq, 0,
                         IPSET_CMD_TYPE);
        if (!nlh2)
                goto nlmsg_failure;
@@ -2010,7 +2022,8 @@ IPSET_CBFN(ip_set_type, struct net *net, struct sock *ctnl,
        nlmsg_end(skb2, nlh2);
 
        pr_debug("Send TYPE, nlmsg_len: %u\n", nlh2->nlmsg_len);
-       ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT);
+       ret = netlink_unicast(INFO_SK(info, ctnl), skb2, NETLINK_PORTID(skb),
+                             MSG_DONTWAIT);
        if (ret < 0)
                return ret;
 
@@ -2034,7 +2047,8 @@ static int
 IPSET_CBFN(ip_set_protocol, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
        struct sk_buff *skb2;
        struct nlmsghdr *nlh2;
@@ -2047,7 +2061,7 @@ IPSET_CBFN(ip_set_protocol, struct net *net, struct sock *ctnl,
        if (!skb2)
                return -ENOMEM;
 
-       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0,
+       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), INFO_NLH(info, nlh)->nlmsg_seq, 0,
                         IPSET_CMD_PROTOCOL);
        if (!nlh2)
                goto nlmsg_failure;
@@ -2057,7 +2071,8 @@ IPSET_CBFN(ip_set_protocol, struct net *net, struct sock *ctnl,
                goto nla_put_failure;
        nlmsg_end(skb2, nlh2);
 
-       ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT);
+       ret = netlink_unicast(INFO_SK(info, ctnl), skb2, NETLINK_PORTID(skb),
+                             MSG_DONTWAIT);
        if (ret < 0)
                return ret;
 
@@ -2076,9 +2091,10 @@ static int
 IPSET_CBFN(ip_set_byname, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct sk_buff *skb2;
        struct nlmsghdr *nlh2;
        ip_set_id_t id = IPSET_INVALID_ID;
@@ -2097,7 +2113,7 @@ IPSET_CBFN(ip_set_byname, struct net *net, struct sock *ctnl,
        if (!skb2)
                return -ENOMEM;
 
-       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0,
+       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), INFO_NLH(info, nlh)->nlmsg_seq, 0,
                         IPSET_CMD_GET_BYNAME);
        if (!nlh2)
                goto nlmsg_failure;
@@ -2107,7 +2123,8 @@ IPSET_CBFN(ip_set_byname, struct net *net, struct sock *ctnl,
                goto nla_put_failure;
        nlmsg_end(skb2, nlh2);
 
-       ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT);
+       ret = netlink_unicast(INFO_SK(info, ctnl), skb2, NETLINK_PORTID(skb),
+                             MSG_DONTWAIT);
        if (ret < 0)
                return ret;
 
@@ -2129,9 +2146,10 @@ static int
 IPSET_CBFN(ip_set_byindex, struct net *net, struct sock *ctnl,
           struct sk_buff *skb, const struct nlmsghdr *nlh,
           const struct nlattr * const attr[],
-          struct netlink_ext_ack *extack)
+          struct netlink_ext_ack *extack,
+          const struct nfnl_info *info)
 {
-       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl));
+       struct ip_set_net *inst = ip_set_pernet(IPSET_SOCK_NET(net, ctnl, info));
        struct sk_buff *skb2;
        struct nlmsghdr *nlh2;
        ip_set_id_t id = IPSET_INVALID_ID;
@@ -2153,7 +2171,7 @@ IPSET_CBFN(ip_set_byindex, struct net *net, struct sock *ctnl,
        if (!skb2)
                return -ENOMEM;
 
-       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), nlh->nlmsg_seq, 0,
+       nlh2 = start_msg(skb2, NETLINK_PORTID(skb), INFO_NLH(info, nlh)->nlmsg_seq, 0,
                         IPSET_CMD_GET_BYINDEX);
        if (!nlh2)
                goto nlmsg_failure;
@@ -2162,7 +2180,8 @@ IPSET_CBFN(ip_set_byindex, struct net *net, struct sock *ctnl,
                goto nla_put_failure;
        nlmsg_end(skb2, nlh2);
 
-       ret = netlink_unicast(ctnl, skb2, NETLINK_PORTID(skb), MSG_DONTWAIT);
+       ret = netlink_unicast(INFO_SK(info, ctnl), skb2, NETLINK_PORTID(skb),
+                             MSG_DONTWAIT);
        if (ret < 0)
                return ret;