in clients/ssi_protocol.c [609:638]
static void ssip_pn_rx(struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
if (unlikely(!netif_running(dev))) {
dev_dbg(&dev->dev, "Drop RX packet\n");
dev->stats.rx_dropped++;
dev_kfree_skb(skb);
return;
}
if (unlikely(!pskb_may_pull(skb, SSIP_MIN_PN_HDR))) {
dev_dbg(&dev->dev, "Error drop RX packet\n");
dev->stats.rx_errors++;
dev->stats.rx_length_errors++;
dev_kfree_skb(skb);
return;
}
dev->stats.rx_packets++;
dev->stats.rx_bytes += skb->len;
/* length field is exchanged in network byte order */
((u16 *)skb->data)[2] = ntohs(((u16 *)skb->data)[2]);
dev_dbg(&dev->dev, "RX length fixed (%04x -> %u)\n",
((u16 *)skb->data)[2], ntohs(((u16 *)skb->data)[2]));
skb->protocol = htons(ETH_P_PHONET);
skb_reset_mac_header(skb);
__skb_pull(skb, 1);
netif_rx(skb);
}