Lines Matching refs:skb

350 	struct sk_buff *skb;
362 skb = alloc_skb(size + hlen + tlen,
364 if (skb)
370 skb->priority = TC_PRIO_CONTROL;
376 kfree_skb(skb);
380 skb_dst_set(skb, &rt->dst);
381 skb->dev = dev;
383 skb_reserve(skb, hlen);
384 skb_tailroom_reserve(skb, mtu, tlen);
386 skb_reset_network_header(skb);
387 pip = ip_hdr(skb);
388 skb_put(skb, sizeof(struct iphdr) + 4);
403 ip_select_ident(net, skb, NULL);
409 skb->transport_header = skb->network_header + sizeof(struct iphdr) + 4;
410 skb_put(skb, sizeof(*pig));
411 pig = igmpv3_report_hdr(skb);
417 return skb;
420 static int igmpv3_sendpack(struct sk_buff *skb)
422 struct igmphdr *pig = igmp_hdr(skb);
423 const int igmplen = skb_tail_pointer(skb) - skb_transport_header(skb);
425 pig->csum = ip_compute_csum(igmp_hdr(skb), igmplen);
427 return ip_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb);
435 static struct sk_buff *add_grhead(struct sk_buff *skb, struct ip_mc_list *pmc,
442 if (!skb) {
443 skb = igmpv3_newpack(dev, mtu);
444 if (!skb)
447 pgr = skb_put(skb, sizeof(struct igmpv3_grec));
452 pih = igmpv3_report_hdr(skb);
455 return skb;
458 #define AVAILABLE(skb) ((skb) ? skb_availroom(skb) : 0)
460 static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
472 return skb;
475 return skb;
479 return skb;
493 pih = skb ? igmpv3_report_hdr(skb) : NULL;
498 AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
499 if (skb)
500 igmpv3_sendpack(skb);
501 skb = igmpv3_newpack(dev, mtu);
529 if (AVAILABLE(skb) < sizeof(__be32) +
535 if (skb)
536 igmpv3_sendpack(skb);
537 skb = igmpv3_newpack(dev, mtu);
542 skb = add_grhead(skb, pmc, type, &pgr, mtu);
545 if (!skb)
547 psrc = skb_put(skb, sizeof(__be32));
570 return skb;
573 if (skb && AVAILABLE(skb) < sizeof(struct igmpv3_grec)) {
574 igmpv3_sendpack(skb);
575 skb = NULL; /* add_grhead will get a new one */
577 skb = add_grhead(skb, pmc, type, &pgr, mtu);
585 return skb;
590 struct sk_buff *skb = NULL;
607 skb = add_grec(skb, pmc, type, 0, 0);
617 skb = add_grec(skb, pmc, type, 0, 0);
620 if (!skb)
622 return igmpv3_sendpack(skb);
656 struct sk_buff *skb = NULL;
669 skb = add_grec(skb, pmc, type, 1, 0);
670 skb = add_grec(skb, pmc, dtype, 1, 1);
675 skb = add_grec(skb, pmc, type, 1, 0);
705 skb = add_grec(skb, pmc, type, 0, 0);
706 skb = add_grec(skb, pmc, dtype, 0, 1); /* deleted sources */
714 skb = add_grec(skb, pmc, type, 0, 0);
721 if (!skb)
723 (void) igmpv3_sendpack(skb);
729 struct sk_buff *skb;
760 skb = alloc_skb(IGMP_SIZE + hlen + tlen, GFP_ATOMIC);
761 if (!skb) {
765 skb->priority = TC_PRIO_CONTROL;
767 skb_dst_set(skb, &rt->dst);
769 skb_reserve(skb, hlen);
771 skb_reset_network_header(skb);
772 iph = ip_hdr(skb);
773 skb_put(skb, sizeof(struct iphdr) + 4);
783 ip_select_ident(net, skb, NULL);
789 ih = skb_put(skb, sizeof(struct igmphdr));
796 return ip_local_out(net, skb->sk, skb);
944 static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
947 struct igmphdr *ih = igmp_hdr(skb);
948 struct igmpv3_query *ih3 = igmpv3_query_hdr(skb);
995 if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
998 ih3 = igmpv3_query_hdr(skb);
1000 if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)
1003 ih3 = igmpv3_query_hdr(skb);
1072 int igmp_rcv(struct sk_buff *skb)
1076 struct net_device *dev = skb->dev;
1078 int len = skb->len;
1082 dev = dev_get_by_index_rcu(dev_net(dev), IPCB(skb)->iif);
1091 if (!pskb_may_pull(skb, sizeof(struct igmphdr)))
1094 if (skb_checksum_simple_validate(skb))
1097 ih = igmp_hdr(skb);
1100 dropped = igmp_heard_query(in_dev, skb, len);
1105 if (rt_is_output_route(skb_rtable(skb)))
1108 if (skb->pkt_type == PACKET_MULTICAST ||
1109 skb->pkt_type == PACKET_BROADCAST)
1114 return pim_rcv_v1(skb);
1129 kfree_skb(skb);
1131 consume_skb(skb);
1497 static int ip_mc_check_iphdr(struct sk_buff *skb)
1501 unsigned int offset = skb_network_offset(skb) + sizeof(*iph);
1503 if (!pskb_may_pull(skb, offset))
1506 iph = ip_hdr(skb);
1508 if (iph->version != 4 || ip_hdrlen(skb) < sizeof(*iph))
1511 offset += ip_hdrlen(skb) - sizeof(*iph);
1513 if (!pskb_may_pull(skb, offset))
1516 iph = ip_hdr(skb);
1521 len = skb_network_offset(skb) + ntohs(iph->tot_len);
1522 if (skb->len < len || len < offset)
1525 skb_set_transport_header(skb, offset);
1530 static int ip_mc_check_igmp_reportv3(struct sk_buff *skb)
1532 unsigned int len = skb_transport_offset(skb);
1536 return ip_mc_may_pull(skb, len) ? 0 : -EINVAL;
1539 static int ip_mc_check_igmp_query(struct sk_buff *skb)
1541 unsigned int transport_len = ip_transport_len(skb);
1550 len = skb_transport_offset(skb) + sizeof(struct igmpv3_query);
1551 if (!ip_mc_may_pull(skb, len))
1558 if (!igmp_hdr(skb)->group &&
1559 ip_hdr(skb)->daddr != htonl(INADDR_ALLHOSTS_GROUP))
1565 static int ip_mc_check_igmp_msg(struct sk_buff *skb)
1567 switch (igmp_hdr(skb)->type) {
1573 return ip_mc_check_igmp_reportv3(skb);
1575 return ip_mc_check_igmp_query(skb);
1581 static __sum16 ip_mc_validate_checksum(struct sk_buff *skb)
1583 return skb_checksum_simple_validate(skb);
1586 static int ip_mc_check_igmp_csum(struct sk_buff *skb)
1588 unsigned int len = skb_transport_offset(skb) + sizeof(struct igmphdr);
1589 unsigned int transport_len = ip_transport_len(skb);
1592 if (!ip_mc_may_pull(skb, len))
1595 skb_chk = skb_checksum_trimmed(skb, transport_len,
1600 if (skb_chk != skb)
1608 * @skb: the skb to validate
1611 * skb transport header accordingly and returns zero.
1618 * Caller needs to set the skb network header and free any returned skb if it
1619 * differs from the provided skb.
1621 int ip_mc_check_igmp(struct sk_buff *skb)
1623 int ret = ip_mc_check_iphdr(skb);
1628 if (ip_hdr(skb)->protocol != IPPROTO_IGMP)
1631 ret = ip_mc_check_igmp_csum(skb);
1635 return ip_mc_check_igmp_msg(skb);