forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/net/netfilter/nfnetlink.c
....@@ -33,6 +33,7 @@
3333 MODULE_LICENSE("GPL");
3434 MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
3535 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_NETFILTER);
36
+MODULE_DESCRIPTION("Netfilter messages via netlink socket");
3637
3738 #define nfnl_dereference_protected(id) \
3839 rcu_dereference_protected(table[(id)].subsys, \
....@@ -44,6 +45,23 @@
4445 struct mutex mutex;
4546 const struct nfnetlink_subsystem __rcu *subsys;
4647 } table[NFNL_SUBSYS_COUNT];
48
+
49
+static struct lock_class_key nfnl_lockdep_keys[NFNL_SUBSYS_COUNT];
50
+
51
+static const char *const nfnl_lockdep_names[NFNL_SUBSYS_COUNT] = {
52
+ [NFNL_SUBSYS_NONE] = "nfnl_subsys_none",
53
+ [NFNL_SUBSYS_CTNETLINK] = "nfnl_subsys_ctnetlink",
54
+ [NFNL_SUBSYS_CTNETLINK_EXP] = "nfnl_subsys_ctnetlink_exp",
55
+ [NFNL_SUBSYS_QUEUE] = "nfnl_subsys_queue",
56
+ [NFNL_SUBSYS_ULOG] = "nfnl_subsys_ulog",
57
+ [NFNL_SUBSYS_OSF] = "nfnl_subsys_osf",
58
+ [NFNL_SUBSYS_IPSET] = "nfnl_subsys_ipset",
59
+ [NFNL_SUBSYS_ACCT] = "nfnl_subsys_acct",
60
+ [NFNL_SUBSYS_CTNETLINK_TIMEOUT] = "nfnl_subsys_cttimeout",
61
+ [NFNL_SUBSYS_CTHELPER] = "nfnl_subsys_cthelper",
62
+ [NFNL_SUBSYS_NFTABLES] = "nfnl_subsys_nftables",
63
+ [NFNL_SUBSYS_NFT_COMPAT] = "nfnl_subsys_nftcompat",
64
+};
4765
4866 static const int nfnl_group2type[NFNLGRP_MAX+1] = {
4967 [NFNLGRP_CONNTRACK_NEW] = NFNL_SUBSYS_CTNETLINK,
....@@ -211,8 +229,9 @@
211229 return -ENOMEM;
212230 }
213231
214
- err = nla_parse(cda, ss->cb[cb_id].attr_count, attr, attrlen,
215
- ss->cb[cb_id].policy, extack);
232
+ err = nla_parse_deprecated(cda, ss->cb[cb_id].attr_count,
233
+ attr, attrlen,
234
+ ss->cb[cb_id].policy, extack);
216235 if (err < 0) {
217236 rcu_read_unlock();
218237 return err;
....@@ -314,7 +333,7 @@
314333 return netlink_ack(skb, nlh, -EINVAL, NULL);
315334 replay:
316335 status = 0;
317
-
336
+replay_abort:
318337 skb = netlink_skb_clone(oskb, GFP_KERNEL);
319338 if (!skb)
320339 return netlink_ack(oskb, nlh, -ENOMEM, NULL);
....@@ -426,8 +445,10 @@
426445 goto ack;
427446 }
428447
429
- err = nla_parse(cda, ss->cb[cb_id].attr_count, attr,
430
- attrlen, ss->cb[cb_id].policy, NULL);
448
+ err = nla_parse_deprecated(cda,
449
+ ss->cb[cb_id].attr_count,
450
+ attr, attrlen,
451
+ ss->cb[cb_id].policy, NULL);
431452 if (err < 0)
432453 goto ack;
433454
....@@ -478,7 +499,7 @@
478499 }
479500 done:
480501 if (status & NFNL_BATCH_REPLAY) {
481
- ss->abort(net, oskb);
502
+ ss->abort(net, oskb, NFNL_ABORT_AUTOLOAD);
482503 nfnl_err_reset(&err_list);
483504 kfree_skb(skb);
484505 module_put(ss->owner);
....@@ -489,11 +510,25 @@
489510 status |= NFNL_BATCH_REPLAY;
490511 goto done;
491512 } else if (err) {
492
- ss->abort(net, oskb);
513
+ ss->abort(net, oskb, NFNL_ABORT_NONE);
493514 netlink_ack(oskb, nlmsg_hdr(oskb), err, NULL);
494515 }
495516 } else {
496
- ss->abort(net, oskb);
517
+ enum nfnl_abort_action abort_action;
518
+
519
+ if (status & NFNL_BATCH_FAILURE)
520
+ abort_action = NFNL_ABORT_NONE;
521
+ else
522
+ abort_action = NFNL_ABORT_VALIDATE;
523
+
524
+ err = ss->abort(net, oskb, abort_action);
525
+ if (err == -EAGAIN) {
526
+ nfnl_err_reset(&err_list);
527
+ kfree_skb(skb);
528
+ module_put(ss->owner);
529
+ status |= NFNL_BATCH_FAILURE;
530
+ goto replay_abort;
531
+ }
497532 }
498533 if (ss->cleanup)
499534 ss->cleanup(net);
....@@ -525,8 +560,8 @@
525560 if (skb->len < NLMSG_HDRLEN + sizeof(struct nfgenmsg))
526561 return;
527562
528
- err = nla_parse(cda, NFNL_BATCH_MAX, attr, attrlen, nfnl_batch_policy,
529
- NULL);
563
+ err = nla_parse_deprecated(cda, NFNL_BATCH_MAX, attr, attrlen,
564
+ nfnl_batch_policy, NULL);
530565 if (err < 0) {
531566 netlink_ack(skb, nlh, err, NULL);
532567 return;
....@@ -628,7 +663,7 @@
628663 BUG_ON(nfnl_group2type[i] == NFNL_SUBSYS_NONE);
629664
630665 for (i=0; i<NFNL_SUBSYS_COUNT; i++)
631
- mutex_init(&table[i].mutex);
666
+ __mutex_init(&table[i].mutex, nfnl_lockdep_names[i], &nfnl_lockdep_keys[i]);
632667
633668 return register_pernet_subsys(&nfnetlink_net_ops);
634669 }