Beispiel #1
0
static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
{
	struct inet6_dev *idev = in6_dev_get(skb->dev);
	if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
		if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) {
			UDP6_INC_STATS_BH(UdpInErrors);
			IP6_INC_STATS_BH(idev,Ip6InDiscards);
			if (idev)
				in6_dev_put(idev);
			kfree_skb(skb);
			return 0;
		}
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	}
	if (sock_queue_rcv_skb(sk,skb)<0) {
		UDP6_INC_STATS_BH(UdpInErrors);
		IP6_INC_STATS_BH(idev,Ip6InDiscards);
		if (idev)
			in6_dev_put(idev);
		kfree_skb(skb);
		return 0;
	}
  	IP6_INC_STATS_BH(idev,Ip6InDelivers);
	UDP6_INC_STATS_BH(UdpInDatagrams);

	if (idev)
		in6_dev_put(idev);
	return 0;
}
Beispiel #2
0
static inline int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
{
#if defined(CONFIG_FILTER)
    if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) {
        if ((unsigned short)csum_fold(csum_partial(skb->h.raw, skb->len, skb->csum))) {
            UDP6_INC_STATS_BH(UdpInErrors);
            IP6_INC_STATS_BH(Ip6InDiscards);
            kfree_skb(skb);
            return 0;
        }
        skb->ip_summed = CHECKSUM_UNNECESSARY;
    }
#endif
    if (sock_queue_rcv_skb(sk,skb)<0) {
        UDP6_INC_STATS_BH(UdpInErrors);
        IP6_INC_STATS_BH(Ip6InDiscards);
        kfree_skb(skb);
        return 0;
    }
    IP6_INC_STATS_BH(Ip6InDelivers);
    UDP6_INC_STATS_BH(UdpInDatagrams);
    return 0;
}