int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype, struct net_device *orig_dev) { struct sk_buff *nskb; struct x25_neigh *nb; if (!net_eq(dev_net(dev), &init_net)) goto drop; nskb = skb_copy(skb, GFP_ATOMIC); if (!nskb) goto drop; kfree_skb(skb); skb = nskb; /* */ nb = x25_get_neigh(dev); if (!nb) { printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", dev->name); goto drop; } if (!pskb_may_pull(skb, 1)) return 0; switch (skb->data[0]) { case X25_IFACE_DATA: skb_pull(skb, 1); if (x25_receive_data(skb, nb)) { x25_neigh_put(nb); goto out; } break; case X25_IFACE_CONNECT: x25_link_established(nb); break; case X25_IFACE_DISCONNECT: x25_link_terminated(nb); break; } x25_neigh_put(nb); drop: kfree_skb(skb); out: return 0; }
int x25_llc_receive_frame(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype) { struct x25_neigh *neigh; skb->sk = NULL; /* * Packet received from unrecognised device, throw it away. */ if ((neigh = x25_get_neigh(dev)) == NULL) { printk(KERN_DEBUG "X.25: unknown_neighbour - %s\n", dev->name); kfree_skb(skb); return 0; } return x25_receive_data(skb, neigh); }
int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype) { struct x25_neigh *neigh; int queued; skb->sk = NULL; /* * Packet received from unrecognised device, throw it away. */ if ((neigh = x25_get_neigh(dev)) == NULL) { printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", dev->name); kfree_skb(skb); return 0; } switch (skb->data[0]) { case 0x00: skb_pull(skb, 1); queued = x25_receive_data(skb, neigh); if( ! queued ) /* We need to free the skb ourselves because * net_bh() won't care about our return code. */ kfree_skb(skb); return 0; case 0x01: x25_link_established(neigh); kfree_skb(skb); return 0; case 0x02: x25_link_terminated(neigh); kfree_skb(skb); return 0; case 0x03: kfree_skb(skb); return 0; default: kfree_skb(skb); return 0; } }
int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype, struct net_device *orig_dev) { struct sk_buff *nskb; struct x25_neigh *nb; if (!net_eq(dev_net(dev), &init_net)) goto drop; nskb = skb_copy(skb, GFP_ATOMIC); if (!nskb) goto drop; kfree_skb(skb); skb = nskb; /* * Packet received from unrecognised device, throw it away. */ nb = x25_get_neigh(dev); if (!nb) { printk(KERN_DEBUG "X.25: unknown neighbour - %s\n", dev->name); goto drop; } switch (skb->data[0]) { case 0x00: skb_pull(skb, 1); if (x25_receive_data(skb, nb)) { x25_neigh_put(nb); goto out; } break; case 0x01: x25_link_established(nb); break; case 0x02: x25_link_terminated(nb); break; } x25_neigh_put(nb); drop: kfree_skb(skb); out: return 0; }