/** * recv_msg - handle incoming TIPC message from an InfiniBand interface * * Accept only packets explicitly sent to this node, or broadcast packets; * ignores packets sent using InfiniBand multicast, and traffic sent to other * nodes (which can happen if interface is running in promiscuous mode). */ static int recv_msg(struct sk_buff *buf, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { struct ib_bearer *ib_ptr = (struct ib_bearer *)pt->af_packet_priv; if (!net_eq(dev_net(dev), &init_net)) { kfree_skb(buf); return 0; } if (likely(ib_ptr->bearer)) { if (likely(buf->pkt_type <= PACKET_BROADCAST)) { buf->next = NULL; tipc_recv_msg(buf, ib_ptr->bearer); return 0; } } kfree_skb(buf); return 0; }
static int recv_msg(struct sk_buff *buf, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv; u32 size; if (likely(eb_ptr->bearer)) { size = msg_size((struct tipc_msg *)buf->data); skb_trim(buf, size); if (likely(buf->len == size)) { buf->next = NULL; tipc_recv_msg(buf, eb_ptr->bearer); } else { kfree_skb(buf); } } else { kfree_skb(buf); } return TIPC_OK; }
static int recv_msg(struct sk_buff *buf, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv; u32 size; if (likely(eb_ptr->bearer)) { if (likely(!dev->promiscuity) || !memcmp(buf->mac.raw,dev->dev_addr,ETH_ALEN) || !memcmp(buf->mac.raw,dev->broadcast,ETH_ALEN)) { size = msg_size((struct tipc_msg *)buf->data); skb_trim(buf, size); if (likely(buf->len == size)) { buf->next = NULL; tipc_recv_msg(buf, eb_ptr->bearer); return TIPC_OK; } } } kfree_skb(buf); return TIPC_OK; }