hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/tipc/bearer.c
....@@ -43,6 +43,8 @@
4343 #include "bcast.h"
4444 #include "netlink.h"
4545 #include "udp_media.h"
46
+#include "trace.h"
47
+#include "crypto.h"
4648
4749 #define MAX_ADDR_STR 60
4850
....@@ -61,7 +63,7 @@
6163 {
6264 struct tipc_net *tn = tipc_net(net);
6365
64
- return rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
66
+ return rcu_dereference(tn->bearer_list[bearer_id]);
6567 }
6668
6769 static void bearer_disable(struct net *net, struct tipc_bearer *b);
....@@ -99,7 +101,7 @@
99101 /**
100102 * tipc_media_addr_printf - record media address in print buffer
101103 */
102
-void tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a)
104
+int tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a)
103105 {
104106 char addr_str[MAX_ADDR_STR];
105107 struct tipc_media *m;
....@@ -114,9 +116,10 @@
114116
115117 ret = scnprintf(buf, len, "UNKNOWN(%u)", a->media_id);
116118 for (i = 0; i < sizeof(a->value); i++)
117
- ret += scnprintf(buf - ret, len + ret,
118
- "-%02x", a->value[i]);
119
+ ret += scnprintf(buf + ret, len - ret,
120
+ "-%x", a->value[i]);
119121 }
122
+ return ret;
120123 }
121124
122125 /**
....@@ -208,7 +211,7 @@
208211 struct tipc_bearer *b;
209212
210213 rcu_read_lock();
211
- b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
214
+ b = rcu_dereference(tn->bearer_list[bearer_id]);
212215 if (b)
213216 tipc_disc_add_dest(b->disc);
214217 rcu_read_unlock();
....@@ -220,7 +223,7 @@
220223 struct tipc_bearer *b;
221224
222225 rcu_read_lock();
223
- b = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
226
+ b = rcu_dereference(tn->bearer_list[bearer_id]);
224227 if (b)
225228 tipc_disc_remove_dest(b->disc);
226229 rcu_read_unlock();
....@@ -246,9 +249,8 @@
246249 u32 i;
247250
248251 if (!bearer_name_validate(name, &b_names)) {
249
- errstr = "illegal name";
250252 NL_SET_ERR_MSG(extack, "Illegal name");
251
- goto rejected;
253
+ return res;
252254 }
253255
254256 if (prio > TIPC_MAX_LINK_PRI && prio != TIPC_MEDIA_LINK_PRI) {
....@@ -324,11 +326,12 @@
324326
325327 b->identity = bearer_id;
326328 b->tolerance = m->tolerance;
327
- b->window = m->window;
329
+ b->min_win = m->min_win;
330
+ b->max_win = m->max_win;
328331 b->domain = disc_domain;
329332 b->net_plane = bearer_id + 'A';
330333 b->priority = prio;
331
- test_and_set_bit_lock(0, &b->up);
334
+ refcount_set(&b->refcnt, 1);
332335
333336 res = tipc_disc_create(net, b, &b->bcast_addr, &skb);
334337 if (res) {
....@@ -338,14 +341,17 @@
338341 goto rejected;
339342 }
340343
344
+ /* Create monitoring data before accepting activate messages */
345
+ if (tipc_mon_create(net, bearer_id)) {
346
+ bearer_disable(net, b);
347
+ kfree_skb(skb);
348
+ return -ENOMEM;
349
+ }
350
+
351
+ test_and_set_bit_lock(0, &b->up);
341352 rcu_assign_pointer(tn->bearer_list[bearer_id], b);
342353 if (skb)
343354 tipc_bearer_xmit_skb(net, bearer_id, skb, &b->bcast_addr);
344
-
345
- if (tipc_mon_create(net, bearer_id)) {
346
- bearer_disable(net, b);
347
- return -ENOMEM;
348
- }
349355
350356 pr_info("Enabled bearer <%s>, priority %u\n", name, prio);
351357
....@@ -366,6 +372,17 @@
366372 return 0;
367373 }
368374
375
+bool tipc_bearer_hold(struct tipc_bearer *b)
376
+{
377
+ return (b && refcount_inc_not_zero(&b->refcnt));
378
+}
379
+
380
+void tipc_bearer_put(struct tipc_bearer *b)
381
+{
382
+ if (b && refcount_dec_and_test(&b->refcnt))
383
+ kfree_rcu(b, rcu);
384
+}
385
+
369386 /**
370387 * bearer_disable
371388 *
....@@ -384,7 +401,7 @@
384401 if (b->disc)
385402 tipc_disc_delete(b->disc);
386403 RCU_INIT_POINTER(tn->bearer_list[bearer_id], NULL);
387
- kfree_rcu(b, rcu);
404
+ tipc_bearer_put(b);
388405 tipc_mon_delete(net, bearer_id);
389406 }
390407
....@@ -402,6 +419,11 @@
402419 return -ENODEV;
403420 if (tipc_mtu_bad(dev, 0)) {
404421 dev_put(dev);
422
+ return -EINVAL;
423
+ }
424
+ if (dev == net->loopback_dev) {
425
+ dev_put(dev);
426
+ pr_info("Enabling <%s> not permitted\n", b->name);
405427 return -EINVAL;
406428 }
407429
....@@ -459,7 +481,7 @@
459481 struct net_device *dev;
460482 int delta;
461483
462
- dev = (struct net_device *)rcu_dereference_rtnl(b->media_ptr);
484
+ dev = (struct net_device *)rcu_dereference(b->media_ptr);
463485 if (!dev)
464486 return 0;
465487
....@@ -496,7 +518,7 @@
496518 struct tipc_bearer *b;
497519
498520 rcu_read_lock();
499
- b = rcu_dereference_rtnl(tipc_net(net)->bearer_list[bearer_id]);
521
+ b = rcu_dereference(tipc_net(net)->bearer_list[bearer_id]);
500522 if (b)
501523 mtu = b->mtu;
502524 rcu_read_unlock();
....@@ -514,10 +536,15 @@
514536
515537 rcu_read_lock();
516538 b = bearer_get(net, bearer_id);
517
- if (likely(b && (test_bit(0, &b->up) || msg_is_reset(hdr))))
518
- b->media->send_msg(net, skb, b, dest);
519
- else
539
+ if (likely(b && (test_bit(0, &b->up) || msg_is_reset(hdr)))) {
540
+#ifdef CONFIG_TIPC_CRYPTO
541
+ tipc_crypto_xmit(net, &skb, b, dest, NULL);
542
+ if (skb)
543
+#endif
544
+ b->media->send_msg(net, skb, b, dest);
545
+ } else {
520546 kfree_skb(skb);
547
+ }
521548 rcu_read_unlock();
522549 }
523550
....@@ -525,7 +552,8 @@
525552 */
526553 void tipc_bearer_xmit(struct net *net, u32 bearer_id,
527554 struct sk_buff_head *xmitq,
528
- struct tipc_media_addr *dst)
555
+ struct tipc_media_addr *dst,
556
+ struct tipc_node *__dnode)
529557 {
530558 struct tipc_bearer *b;
531559 struct sk_buff *skb, *tmp;
....@@ -539,10 +567,15 @@
539567 __skb_queue_purge(xmitq);
540568 skb_queue_walk_safe(xmitq, skb, tmp) {
541569 __skb_dequeue(xmitq);
542
- if (likely(test_bit(0, &b->up) || msg_is_reset(buf_msg(skb))))
543
- b->media->send_msg(net, skb, b, dst);
544
- else
570
+ if (likely(test_bit(0, &b->up) || msg_is_reset(buf_msg(skb)))) {
571
+#ifdef CONFIG_TIPC_CRYPTO
572
+ tipc_crypto_xmit(net, &skb, b, dst, __dnode);
573
+ if (skb)
574
+#endif
575
+ b->media->send_msg(net, skb, b, dst);
576
+ } else {
545577 kfree_skb(skb);
578
+ }
546579 }
547580 rcu_read_unlock();
548581 }
....@@ -553,6 +586,7 @@
553586 struct sk_buff_head *xmitq)
554587 {
555588 struct tipc_net *tn = tipc_net(net);
589
+ struct tipc_media_addr *dst;
556590 int net_id = tn->net_id;
557591 struct tipc_bearer *b;
558592 struct sk_buff *skb, *tmp;
....@@ -567,14 +601,19 @@
567601 msg_set_non_seq(hdr, 1);
568602 msg_set_mc_netid(hdr, net_id);
569603 __skb_dequeue(xmitq);
570
- b->media->send_msg(net, skb, b, &b->bcast_addr);
604
+ dst = &b->bcast_addr;
605
+#ifdef CONFIG_TIPC_CRYPTO
606
+ tipc_crypto_xmit(net, &skb, b, dst, NULL);
607
+ if (skb)
608
+#endif
609
+ b->media->send_msg(net, skb, b, dst);
571610 }
572611 rcu_read_unlock();
573612 }
574613
575614 /**
576615 * tipc_l2_rcv_msg - handle incoming TIPC message from an interface
577
- * @buf: the received packet
616
+ * @skb: the received message
578617 * @dev: the net device that the packet was received on
579618 * @pt: the packet_type structure which was used to register this handler
580619 * @orig_dev: the original receive net device in case the device is a bond
....@@ -589,11 +628,12 @@
589628 struct tipc_bearer *b;
590629
591630 rcu_read_lock();
592
- b = rcu_dereference_rtnl(dev->tipc_ptr) ?:
593
- rcu_dereference_rtnl(orig_dev->tipc_ptr);
631
+ b = rcu_dereference(dev->tipc_ptr) ?:
632
+ rcu_dereference(orig_dev->tipc_ptr);
594633 if (likely(b && test_bit(0, &b->up) &&
595634 (skb->pkt_type <= PACKET_MULTICAST))) {
596
- skb->next = NULL;
635
+ skb_mark_not_on_list(skb);
636
+ TIPC_SKB_CB(skb)->flags = 0;
597637 tipc_rcv(dev_net(b->pt.dev), skb, b);
598638 rcu_read_unlock();
599639 return NET_RX_SUCCESS;
....@@ -623,13 +663,14 @@
623663 if (!b)
624664 return NOTIFY_DONE;
625665
666
+ trace_tipc_l2_device_event(dev, b, evt);
626667 switch (evt) {
627668 case NETDEV_CHANGE:
628669 if (netif_carrier_ok(dev) && netif_oper_up(dev)) {
629670 test_and_set_bit_lock(0, &b->up);
630671 break;
631672 }
632
- /* fall through */
673
+ fallthrough;
633674 case NETDEV_GOING_DOWN:
634675 clear_bit_unlock(0, &b->up);
635676 tipc_reset_bearer(net, b);
....@@ -688,6 +729,65 @@
688729 }
689730 }
690731
732
+void tipc_clone_to_loopback(struct net *net, struct sk_buff_head *pkts)
733
+{
734
+ struct net_device *dev = net->loopback_dev;
735
+ struct sk_buff *skb, *_skb;
736
+ int exp;
737
+
738
+ skb_queue_walk(pkts, _skb) {
739
+ skb = pskb_copy(_skb, GFP_ATOMIC);
740
+ if (!skb)
741
+ continue;
742
+
743
+ exp = SKB_DATA_ALIGN(dev->hard_header_len - skb_headroom(skb));
744
+ if (exp > 0 && pskb_expand_head(skb, exp, 0, GFP_ATOMIC)) {
745
+ kfree_skb(skb);
746
+ continue;
747
+ }
748
+
749
+ skb_reset_network_header(skb);
750
+ dev_hard_header(skb, dev, ETH_P_TIPC, dev->dev_addr,
751
+ dev->dev_addr, skb->len);
752
+ skb->dev = dev;
753
+ skb->pkt_type = PACKET_HOST;
754
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
755
+ skb->protocol = eth_type_trans(skb, dev);
756
+ netif_rx_ni(skb);
757
+ }
758
+}
759
+
760
+static int tipc_loopback_rcv_pkt(struct sk_buff *skb, struct net_device *dev,
761
+ struct packet_type *pt, struct net_device *od)
762
+{
763
+ consume_skb(skb);
764
+ return NET_RX_SUCCESS;
765
+}
766
+
767
+int tipc_attach_loopback(struct net *net)
768
+{
769
+ struct net_device *dev = net->loopback_dev;
770
+ struct tipc_net *tn = tipc_net(net);
771
+
772
+ if (!dev)
773
+ return -ENODEV;
774
+
775
+ dev_hold(dev);
776
+ tn->loopback_pt.dev = dev;
777
+ tn->loopback_pt.type = htons(ETH_P_TIPC);
778
+ tn->loopback_pt.func = tipc_loopback_rcv_pkt;
779
+ dev_add_pack(&tn->loopback_pt);
780
+ return 0;
781
+}
782
+
783
+void tipc_detach_loopback(struct net *net)
784
+{
785
+ struct tipc_net *tn = tipc_net(net);
786
+
787
+ dev_remove_pack(&tn->loopback_pt);
788
+ dev_put(net->loopback_dev);
789
+}
790
+
691791 /* Caller should hold rtnl_lock to protect the bearer */
692792 static int __tipc_nl_add_bearer(struct tipc_nl_msg *msg,
693793 struct tipc_bearer *bearer, int nlflags)
....@@ -701,21 +801,21 @@
701801 if (!hdr)
702802 return -EMSGSIZE;
703803
704
- attrs = nla_nest_start(msg->skb, TIPC_NLA_BEARER);
804
+ attrs = nla_nest_start_noflag(msg->skb, TIPC_NLA_BEARER);
705805 if (!attrs)
706806 goto msg_full;
707807
708808 if (nla_put_string(msg->skb, TIPC_NLA_BEARER_NAME, bearer->name))
709809 goto attr_msg_full;
710810
711
- prop = nla_nest_start(msg->skb, TIPC_NLA_BEARER_PROP);
811
+ prop = nla_nest_start_noflag(msg->skb, TIPC_NLA_BEARER_PROP);
712812 if (!prop)
713813 goto prop_msg_full;
714814 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_PRIO, bearer->priority))
715815 goto prop_msg_full;
716816 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_TOL, bearer->tolerance))
717817 goto prop_msg_full;
718
- if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, bearer->window))
818
+ if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, bearer->max_win))
719819 goto prop_msg_full;
720820 if (bearer->media->type_id == TIPC_MEDIA_TYPE_UDP)
721821 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, bearer->mtu))
....@@ -790,9 +890,9 @@
790890 if (!info->attrs[TIPC_NLA_BEARER])
791891 return -EINVAL;
792892
793
- err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
794
- info->attrs[TIPC_NLA_BEARER],
795
- tipc_nl_bearer_policy, info->extack);
893
+ err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
894
+ info->attrs[TIPC_NLA_BEARER],
895
+ tipc_nl_bearer_policy, info->extack);
796896 if (err)
797897 return err;
798898
....@@ -840,9 +940,9 @@
840940 if (!info->attrs[TIPC_NLA_BEARER])
841941 return -EINVAL;
842942
843
- err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
844
- info->attrs[TIPC_NLA_BEARER],
845
- tipc_nl_bearer_policy, info->extack);
943
+ err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
944
+ info->attrs[TIPC_NLA_BEARER],
945
+ tipc_nl_bearer_policy, info->extack);
846946 if (err)
847947 return err;
848948
....@@ -887,9 +987,9 @@
887987 if (!info->attrs[TIPC_NLA_BEARER])
888988 return -EINVAL;
889989
890
- err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
891
- info->attrs[TIPC_NLA_BEARER],
892
- tipc_nl_bearer_policy, info->extack);
990
+ err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
991
+ info->attrs[TIPC_NLA_BEARER],
992
+ tipc_nl_bearer_policy, info->extack);
893993 if (err)
894994 return err;
895995
....@@ -939,9 +1039,9 @@
9391039 if (!info->attrs[TIPC_NLA_BEARER])
9401040 return -EINVAL;
9411041
942
- err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
943
- info->attrs[TIPC_NLA_BEARER],
944
- tipc_nl_bearer_policy, info->extack);
1042
+ err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
1043
+ info->attrs[TIPC_NLA_BEARER],
1044
+ tipc_nl_bearer_policy, info->extack);
9451045 if (err)
9461046 return err;
9471047
....@@ -983,9 +1083,9 @@
9831083 if (!info->attrs[TIPC_NLA_BEARER])
9841084 return -EINVAL;
9851085
986
- err = nla_parse_nested(attrs, TIPC_NLA_BEARER_MAX,
987
- info->attrs[TIPC_NLA_BEARER],
988
- tipc_nl_bearer_policy, info->extack);
1086
+ err = nla_parse_nested_deprecated(attrs, TIPC_NLA_BEARER_MAX,
1087
+ info->attrs[TIPC_NLA_BEARER],
1088
+ tipc_nl_bearer_policy, info->extack);
9891089 if (err)
9901090 return err;
9911091
....@@ -1014,7 +1114,7 @@
10141114 if (props[TIPC_NLA_PROP_PRIO])
10151115 b->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
10161116 if (props[TIPC_NLA_PROP_WIN])
1017
- b->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
1117
+ b->max_win = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
10181118 if (props[TIPC_NLA_PROP_MTU]) {
10191119 if (b->media->type_id != TIPC_MEDIA_TYPE_UDP) {
10201120 NL_SET_ERR_MSG(info->extack,
....@@ -1060,21 +1160,21 @@
10601160 if (!hdr)
10611161 return -EMSGSIZE;
10621162
1063
- attrs = nla_nest_start(msg->skb, TIPC_NLA_MEDIA);
1163
+ attrs = nla_nest_start_noflag(msg->skb, TIPC_NLA_MEDIA);
10641164 if (!attrs)
10651165 goto msg_full;
10661166
10671167 if (nla_put_string(msg->skb, TIPC_NLA_MEDIA_NAME, media->name))
10681168 goto attr_msg_full;
10691169
1070
- prop = nla_nest_start(msg->skb, TIPC_NLA_MEDIA_PROP);
1170
+ prop = nla_nest_start_noflag(msg->skb, TIPC_NLA_MEDIA_PROP);
10711171 if (!prop)
10721172 goto prop_msg_full;
10731173 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_PRIO, media->priority))
10741174 goto prop_msg_full;
10751175 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_TOL, media->tolerance))
10761176 goto prop_msg_full;
1077
- if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, media->window))
1177
+ if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, media->max_win))
10781178 goto prop_msg_full;
10791179 if (media->type_id == TIPC_MEDIA_TYPE_UDP)
10801180 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, media->mtu))
....@@ -1129,14 +1229,14 @@
11291229 struct tipc_nl_msg msg;
11301230 struct tipc_media *media;
11311231 struct sk_buff *rep;
1132
- struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];
1232
+ struct nlattr *attrs[TIPC_NLA_MEDIA_MAX + 1];
11331233
11341234 if (!info->attrs[TIPC_NLA_MEDIA])
11351235 return -EINVAL;
11361236
1137
- err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX,
1138
- info->attrs[TIPC_NLA_MEDIA],
1139
- tipc_nl_media_policy, info->extack);
1237
+ err = nla_parse_nested_deprecated(attrs, TIPC_NLA_MEDIA_MAX,
1238
+ info->attrs[TIPC_NLA_MEDIA],
1239
+ tipc_nl_media_policy, info->extack);
11401240 if (err)
11411241 return err;
11421242
....@@ -1178,14 +1278,14 @@
11781278 int err;
11791279 char *name;
11801280 struct tipc_media *m;
1181
- struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];
1281
+ struct nlattr *attrs[TIPC_NLA_MEDIA_MAX + 1];
11821282
11831283 if (!info->attrs[TIPC_NLA_MEDIA])
11841284 return -EINVAL;
11851285
1186
- err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX,
1187
- info->attrs[TIPC_NLA_MEDIA],
1188
- tipc_nl_media_policy, info->extack);
1286
+ err = nla_parse_nested_deprecated(attrs, TIPC_NLA_MEDIA_MAX,
1287
+ info->attrs[TIPC_NLA_MEDIA],
1288
+ tipc_nl_media_policy, info->extack);
11891289
11901290 if (!attrs[TIPC_NLA_MEDIA_NAME])
11911291 return -EINVAL;
....@@ -1209,7 +1309,7 @@
12091309 if (props[TIPC_NLA_PROP_PRIO])
12101310 m->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
12111311 if (props[TIPC_NLA_PROP_WIN])
1212
- m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
1312
+ m->max_win = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
12131313 if (props[TIPC_NLA_PROP_MTU]) {
12141314 if (m->type_id != TIPC_MEDIA_TYPE_UDP) {
12151315 NL_SET_ERR_MSG(info->extack,