--- initial
+++ final
@@ -1,165 +1,165 @@
 static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n) {
   struct net *net = sock_net(skb->sk);
   struct nlattr *tca[TCA_MAX + 1];
   struct tcmsg *t;
   u32 protocol;
   u32 prio;
   u32 nprio;
   u32 parent;
   struct net_device *dev;
   struct Qdisc *q;
   struct tcf_proto __rcu **back;
   struct tcf_proto __rcu **chain;
   struct tcf_proto *next;
   struct tcf_proto *tp;
   const struct Qdisc_class_ops *cops;
   unsigned long cl;
   unsigned long fh;
   int err;
   int tp_created;
   if ((n->nlmsg_type != RTM_GETTFILTER) && !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) return -EPERM;
 replay:
   tp_created = 0;
-  err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL);
+  err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL, NULL);
   if (err < 0) return err;
   t = nlmsg_data(n);
   protocol = TC_H_MIN(t->tcm_info);
   prio = TC_H_MAJ(t->tcm_info);
   nprio = prio;
   parent = t->tcm_parent;
   cl = 0;
   if (prio == 0) {
     switch (n->nlmsg_type) {
     case RTM_DELTFILTER:
       if (protocol || t->tcm_handle || tca[TCA_KIND]) return -ENOENT;
       break;
     case RTM_NEWTFILTER:
       /* If no priority is provided by the user,
        * we allocate one.
        */
       if (n->nlmsg_flags & NLM_F_CREATE) {
         prio = TC_H_MAKE(0x80000000U, 0U);
         break;
       }
       /* fall-through */
     default: return -ENOENT;
     }
   }
   /* Find head of filter chain. */
   /* Find link */
   dev = __dev_get_by_index(net, t->tcm_ifindex);
   if (dev == NULL) return -ENODEV;
   /* Find qdisc */
   if (!parent) {
     q = dev->qdisc;
     parent = q->handle;
   } else {
     q = qdisc_lookup(dev, TC_H_MAJ(t->tcm_parent));
     if (q == NULL) return -EINVAL;
   }
   /* Is it classful? */
   cops = q->ops->cl_ops;
   if (!cops) return -EINVAL;
   if (cops->tcf_chain == NULL) return -EOPNOTSUPP;
   /* Do we search for filter, attached to class? */
   if (TC_H_MIN(parent)) {
     cl = cops->get(q, parent);
     if (cl == 0) return -ENOENT;
   }
   /* And the last stroke */
   chain = cops->tcf_chain(q, cl);
   if (chain == NULL) {
     err = -EINVAL;
     goto errout;
   }
   if (n->nlmsg_type == RTM_DELTFILTER && prio == 0) {
     tfilter_notify_chain(net, skb, n, chain, RTM_DELTFILTER);
     tcf_destroy_chain(chain);
     err = 0;
     goto errout;
   }
   /* Check the chain for existence of proto-tcf with this priority */
   for (back = chain; (tp = rtnl_dereference(*back)) != NULL; back = &tp->next) {
     if (tp->prio >= prio) {
       if (tp->prio == prio) {
         if (!nprio || (tp->protocol != protocol && protocol)) {
           err = -EINVAL;
           goto errout;
         }
       } else {
         tp = NULL;
       }
       break;
     }
   }
   if (tp == NULL) {
     /* Proto-tcf does not exist, create new one */
     if (tca[TCA_KIND] == NULL || !protocol) {
       err = -EINVAL;
       goto errout;
     }
     if (n->nlmsg_type != RTM_NEWTFILTER || !(n->nlmsg_flags & NLM_F_CREATE)) {
       err = -ENOENT;
       goto errout;
     }
     if (!nprio) nprio = TC_H_MAJ(tcf_auto_prio(rtnl_dereference(*back)));
     tp = tcf_proto_create(nla_data(tca[TCA_KIND]), protocol, nprio, parent, q);
     if (IS_ERR(tp)) {
       err = PTR_ERR(tp);
       goto errout;
     }
     tp_created = 1;
   } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind)) {
     err = -EINVAL;
     goto errout;
   }
   fh = tp->ops->get(tp, t->tcm_handle);
   if (fh == 0) {
     if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) {
       next = rtnl_dereference(tp->next);
       RCU_INIT_POINTER(*back, next);
       tfilter_notify(net, skb, n, tp, fh, RTM_DELTFILTER, false);
       tcf_proto_destroy(tp, true);
       err = 0;
       goto errout;
     }
     if (n->nlmsg_type != RTM_NEWTFILTER || !(n->nlmsg_flags & NLM_F_CREATE)) {
       err = -ENOENT;
       goto errout;
     }
   } else {
     switch (n->nlmsg_type) {
     case RTM_NEWTFILTER:
       if (n->nlmsg_flags & NLM_F_EXCL) {
         if (tp_created) tcf_proto_destroy(tp, true);
         err = -EEXIST;
         goto errout;
       }
       break;
     case RTM_DELTFILTER:
       err = tp->ops->delete (tp, fh);
       if (err) goto errout;
       next = rtnl_dereference(tp->next);
       tfilter_notify(net, skb, n, tp, t->tcm_handle, RTM_DELTFILTER, false);
       if (tcf_proto_destroy(tp, false)) RCU_INIT_POINTER(*back, next);
       goto errout;
     case RTM_GETTFILTER: err = tfilter_notify(net, skb, n, tp, fh, RTM_NEWTFILTER, true); goto errout;
     default: err = -EINVAL; goto errout;
     }
   }
   err = tp->ops->change(net, skb, tp, cl, t->tcm_handle, tca, &fh, n->nlmsg_flags & NLM_F_CREATE ? TCA_ACT_NOREPLACE : TCA_ACT_REPLACE);
   if (err == 0) {
     if (tp_created) {
       RCU_INIT_POINTER(tp->next, rtnl_dereference(*back));
       rcu_assign_pointer(*back, tp);
     }
     tfilter_notify(net, skb, n, tp, fh, RTM_NEWTFILTER, false);
   } else {
     if (tp_created) tcf_proto_destroy(tp, true);
   }
 errout:
   if (cl) cops->put(q, cl);
   if (err == -EAGAIN) /* Replay the request. */
     goto replay;
   return err;
 }<sep>@@
expression e1,e2,e3,e4,e5;
@@
       nlmsg_parse(e1,e2,e3,e4,e5
+            , NULL
       )