pvfc = skb_header_pointer(skb, 0, 1, &buf); if (!pvfc) return htons(0); /* Look at IP version field */ switch (*pvfc >> 4) { case 4: return htons(ETH_P_IP); case 6: return htons(ETH_P_IPV6);
} return htons(0);
}
if (skb_headroom(skb) & 3) { struct sk_buff *rskb, *fs; int flen = 0;
/* Phonet Pipe data header may be misaligned (3 bytes), * so wrap the IP packet as a single fragment of an head-less * socket buffer. The network stack will pull what it needs,
* but at least, the whole IP payload is not memcpy'd. */
rskb = netdev_alloc_skb(dev, 0); if (!rskb) {
err = -ENOBUFS; goto drop;
}
skb_shinfo(rskb)->frag_list = skb;
rskb->len += skb->len;
rskb->data_len += rskb->len;
rskb->truesize += rskb->len;
/* * Attach a GPRS interface to a datagram socket. * Returns the interface index on success, negative error code on error.
*/ int gprs_attach(struct sock *sk)
{ staticconstchar ifname[] = "gprs%d"; struct gprs_dev *gp; struct net_device *dev; int err;
if (unlikely(sk->sk_type == SOCK_STREAM)) return -EINVAL; /* need packet boundaries */
/* Create net device */
dev = alloc_netdev(sizeof(*gp), ifname, NET_NAME_UNKNOWN, gprs_setup); if (!dev) return -ENOMEM;
gp = netdev_priv(dev);
gp->sk = sk;
gp->dev = dev;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.