bearer.c (2a7ee696f7b000a970dcce0cb06fdcd0a9e6ee76) bearer.c (fc1b6d6de2208774efd2a20bf0daddb02d18b1e0)
1/*
2 * net/tipc/bearer.c: TIPC bearer code
3 *
4 * Copyright (c) 1996-2006, 2013-2016, Ericsson AB
5 * Copyright (c) 2004-2006, 2010-2013, Wind River Systems
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 30 unchanged lines hidden (view full) ---

39#include "bearer.h"
40#include "link.h"
41#include "discover.h"
42#include "monitor.h"
43#include "bcast.h"
44#include "netlink.h"
45#include "udp_media.h"
46#include "trace.h"
1/*
2 * net/tipc/bearer.c: TIPC bearer code
3 *
4 * Copyright (c) 1996-2006, 2013-2016, Ericsson AB
5 * Copyright (c) 2004-2006, 2010-2013, Wind River Systems
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 30 unchanged lines hidden (view full) ---

39#include "bearer.h"
40#include "link.h"
41#include "discover.h"
42#include "monitor.h"
43#include "bcast.h"
44#include "netlink.h"
45#include "udp_media.h"
46#include "trace.h"
47#include "crypto.h"
47
48#define MAX_ADDR_STR 60
49
50static struct tipc_media * const media_info_array[] = {
51 &eth_media_info,
52#ifdef CONFIG_TIPC_MEDIA_IB
53 &ib_media_info,
54#endif

--- 456 unchanged lines hidden (view full) ---

511 struct sk_buff *skb,
512 struct tipc_media_addr *dest)
513{
514 struct tipc_msg *hdr = buf_msg(skb);
515 struct tipc_bearer *b;
516
517 rcu_read_lock();
518 b = bearer_get(net, bearer_id);
48
49#define MAX_ADDR_STR 60
50
51static struct tipc_media * const media_info_array[] = {
52 &eth_media_info,
53#ifdef CONFIG_TIPC_MEDIA_IB
54 &ib_media_info,
55#endif

--- 456 unchanged lines hidden (view full) ---

512 struct sk_buff *skb,
513 struct tipc_media_addr *dest)
514{
515 struct tipc_msg *hdr = buf_msg(skb);
516 struct tipc_bearer *b;
517
518 rcu_read_lock();
519 b = bearer_get(net, bearer_id);
519 if (likely(b && (test_bit(0, &b->up) || msg_is_reset(hdr))))
520 b->media->send_msg(net, skb, b, dest);
521 else
520 if (likely(b && (test_bit(0, &b->up) || msg_is_reset(hdr)))) {
521#ifdef CONFIG_TIPC_CRYPTO
522 tipc_crypto_xmit(net, &skb, b, dest, NULL);
523 if (skb)
524#endif
525 b->media->send_msg(net, skb, b, dest);
526 } else {
522 kfree_skb(skb);
527 kfree_skb(skb);
528 }
523 rcu_read_unlock();
524}
525
526/* tipc_bearer_xmit() -send buffer to destination over bearer
527 */
528void tipc_bearer_xmit(struct net *net, u32 bearer_id,
529 struct sk_buff_head *xmitq,
529 rcu_read_unlock();
530}
531
532/* tipc_bearer_xmit() -send buffer to destination over bearer
533 */
534void tipc_bearer_xmit(struct net *net, u32 bearer_id,
535 struct sk_buff_head *xmitq,
530 struct tipc_media_addr *dst)
536 struct tipc_media_addr *dst,
537 struct tipc_node *__dnode)
531{
532 struct tipc_bearer *b;
533 struct sk_buff *skb, *tmp;
534
535 if (skb_queue_empty(xmitq))
536 return;
537
538 rcu_read_lock();
539 b = bearer_get(net, bearer_id);
540 if (unlikely(!b))
541 __skb_queue_purge(xmitq);
542 skb_queue_walk_safe(xmitq, skb, tmp) {
543 __skb_dequeue(xmitq);
538{
539 struct tipc_bearer *b;
540 struct sk_buff *skb, *tmp;
541
542 if (skb_queue_empty(xmitq))
543 return;
544
545 rcu_read_lock();
546 b = bearer_get(net, bearer_id);
547 if (unlikely(!b))
548 __skb_queue_purge(xmitq);
549 skb_queue_walk_safe(xmitq, skb, tmp) {
550 __skb_dequeue(xmitq);
544 if (likely(test_bit(0, &b->up) || msg_is_reset(buf_msg(skb))))
545 b->media->send_msg(net, skb, b, dst);
546 else
551 if (likely(test_bit(0, &b->up) || msg_is_reset(buf_msg(skb)))) {
552#ifdef CONFIG_TIPC_CRYPTO
553 tipc_crypto_xmit(net, &skb, b, dst, __dnode);
554 if (skb)
555#endif
556 b->media->send_msg(net, skb, b, dst);
557 } else {
547 kfree_skb(skb);
558 kfree_skb(skb);
559 }
548 }
549 rcu_read_unlock();
550}
551
552/* tipc_bearer_bc_xmit() - broadcast buffers to all destinations
553 */
554void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
555 struct sk_buff_head *xmitq)
556{
557 struct tipc_net *tn = tipc_net(net);
560 }
561 rcu_read_unlock();
562}
563
564/* tipc_bearer_bc_xmit() - broadcast buffers to all destinations
565 */
566void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
567 struct sk_buff_head *xmitq)
568{
569 struct tipc_net *tn = tipc_net(net);
570 struct tipc_media_addr *dst;
558 int net_id = tn->net_id;
559 struct tipc_bearer *b;
560 struct sk_buff *skb, *tmp;
561 struct tipc_msg *hdr;
562
563 rcu_read_lock();
564 b = bearer_get(net, bearer_id);
565 if (unlikely(!b || !test_bit(0, &b->up)))
566 __skb_queue_purge(xmitq);
567 skb_queue_walk_safe(xmitq, skb, tmp) {
568 hdr = buf_msg(skb);
569 msg_set_non_seq(hdr, 1);
570 msg_set_mc_netid(hdr, net_id);
571 __skb_dequeue(xmitq);
571 int net_id = tn->net_id;
572 struct tipc_bearer *b;
573 struct sk_buff *skb, *tmp;
574 struct tipc_msg *hdr;
575
576 rcu_read_lock();
577 b = bearer_get(net, bearer_id);
578 if (unlikely(!b || !test_bit(0, &b->up)))
579 __skb_queue_purge(xmitq);
580 skb_queue_walk_safe(xmitq, skb, tmp) {
581 hdr = buf_msg(skb);
582 msg_set_non_seq(hdr, 1);
583 msg_set_mc_netid(hdr, net_id);
584 __skb_dequeue(xmitq);
572 b->media->send_msg(net, skb, b, &b->bcast_addr);
585 dst = &b->bcast_addr;
586#ifdef CONFIG_TIPC_CRYPTO
587 tipc_crypto_xmit(net, &skb, b, dst, NULL);
588 if (skb)
589#endif
590 b->media->send_msg(net, skb, b, dst);
573 }
574 rcu_read_unlock();
575}
576
577/**
578 * tipc_l2_rcv_msg - handle incoming TIPC message from an interface
579 * @buf: the received packet
580 * @dev: the net device that the packet was received on

--- 10 unchanged lines hidden (view full) ---

591 struct tipc_bearer *b;
592
593 rcu_read_lock();
594 b = rcu_dereference(dev->tipc_ptr) ?:
595 rcu_dereference(orig_dev->tipc_ptr);
596 if (likely(b && test_bit(0, &b->up) &&
597 (skb->pkt_type <= PACKET_MULTICAST))) {
598 skb_mark_not_on_list(skb);
591 }
592 rcu_read_unlock();
593}
594
595/**
596 * tipc_l2_rcv_msg - handle incoming TIPC message from an interface
597 * @buf: the received packet
598 * @dev: the net device that the packet was received on

--- 10 unchanged lines hidden (view full) ---

609 struct tipc_bearer *b;
610
611 rcu_read_lock();
612 b = rcu_dereference(dev->tipc_ptr) ?:
613 rcu_dereference(orig_dev->tipc_ptr);
614 if (likely(b && test_bit(0, &b->up) &&
615 (skb->pkt_type <= PACKET_MULTICAST))) {
616 skb_mark_not_on_list(skb);
617 TIPC_SKB_CB(skb)->flags = 0;
599 tipc_rcv(dev_net(b->pt.dev), skb, b);
600 rcu_read_unlock();
601 return NET_RX_SUCCESS;
602 }
603 rcu_read_unlock();
604 kfree_skb(skb);
605 return NET_RX_DROP;
606}

--- 678 unchanged lines hidden ---
618 tipc_rcv(dev_net(b->pt.dev), skb, b);
619 rcu_read_unlock();
620 return NET_RX_SUCCESS;
621 }
622 rcu_read_unlock();
623 kfree_skb(skb);
624 return NET_RX_DROP;
625}

--- 678 unchanged lines hidden ---