Lines Matching refs:skb

90 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
91 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
94 static void pndisc_redo(struct sk_buff *skb);
153 static void ndisc_fill_addr_option(struct sk_buff *skb, int type, void *data) in ndisc_fill_addr_option() argument
155 int pad = ndisc_addr_option_pad(skb->dev->type); in ndisc_fill_addr_option()
156 int data_len = skb->dev->addr_len; in ndisc_fill_addr_option()
157 int space = ndisc_opt_addr_space(skb->dev); in ndisc_fill_addr_option()
158 u8 *opt = skb_put(skb, space); in ndisc_fill_addr_option()
386 struct sk_buff *skb; in ndisc_alloc_skb() local
388 skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); in ndisc_alloc_skb()
389 if (!skb) { in ndisc_alloc_skb()
395 skb->protocol = htons(ETH_P_IPV6); in ndisc_alloc_skb()
396 skb->dev = dev; in ndisc_alloc_skb()
398 skb_reserve(skb, hlen + sizeof(struct ipv6hdr)); in ndisc_alloc_skb()
399 skb_reset_transport_header(skb); in ndisc_alloc_skb()
404 skb_set_owner_w(skb, sk); in ndisc_alloc_skb()
406 return skb; in ndisc_alloc_skb()
409 static void ip6_nd_hdr(struct sk_buff *skb, in ip6_nd_hdr() argument
416 skb_push(skb, sizeof(*hdr)); in ip6_nd_hdr()
417 skb_reset_network_header(skb); in ip6_nd_hdr()
418 hdr = ipv6_hdr(skb); in ip6_nd_hdr()
430 static void ndisc_send_skb(struct sk_buff *skb, in ndisc_send_skb() argument
434 struct dst_entry *dst = skb_dst(skb); in ndisc_send_skb()
435 struct net *net = dev_net(skb->dev); in ndisc_send_skb()
439 struct icmp6hdr *icmp6h = icmp6_hdr(skb); in ndisc_send_skb()
446 int oif = l3mdev_fib_oif(skb->dev); in ndisc_send_skb()
449 if (oif != skb->dev->ifindex) in ndisc_send_skb()
451 dst = icmp6_dst_alloc(skb->dev, &fl6); in ndisc_send_skb()
453 kfree_skb(skb); in ndisc_send_skb()
457 skb_dst_set(skb, dst); in ndisc_send_skb()
460 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len, in ndisc_send_skb()
463 skb->len, 0)); in ndisc_send_skb()
465 ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len); in ndisc_send_skb()
469 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in ndisc_send_skb()
472 net, sk, skb, NULL, dst->dev, in ndisc_send_skb()
486 struct sk_buff *skb; in ndisc_send_na() local
514 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen); in ndisc_send_na()
515 if (!skb) in ndisc_send_na()
518 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg)); in ndisc_send_na()
530 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR, in ndisc_send_na()
534 ndisc_send_skb(skb, daddr, src_addr); in ndisc_send_na()
561 struct sk_buff *skb; in ndisc_send_ns() local
579 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen); in ndisc_send_ns()
580 if (!skb) in ndisc_send_ns()
583 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg)); in ndisc_send_ns()
592 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR, in ndisc_send_ns()
595 ndisc_send_skb(skb, daddr, saddr); in ndisc_send_ns()
601 struct sk_buff *skb; in ndisc_send_rs() local
631 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen); in ndisc_send_rs()
632 if (!skb) in ndisc_send_rs()
635 msg = (struct rs_msg *)skb_put(skb, sizeof(*msg)); in ndisc_send_rs()
643 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR, in ndisc_send_rs()
646 ndisc_send_skb(skb, daddr, saddr); in ndisc_send_rs()
650 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb) in ndisc_error_report() argument
656 dst_link_failure(skb); in ndisc_error_report()
657 kfree_skb(skb); in ndisc_error_report()
662 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb) in ndisc_solicit() argument
670 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr, in ndisc_solicit()
673 saddr = &ipv6_hdr(skb)->saddr; in ndisc_solicit()
705 static void ndisc_recv_ns(struct sk_buff *skb) in ndisc_recv_ns() argument
707 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb); in ndisc_recv_ns()
708 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_ns()
709 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_ns()
711 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_ns()
714 struct net_device *dev = skb->dev; in ndisc_recv_ns()
722 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_ns()
818 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && in ndisc_recv_ns()
819 skb->pkt_type != PACKET_HOST && in ndisc_recv_ns()
829 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC); in ndisc_recv_ns()
876 static void ndisc_recv_na(struct sk_buff *skb) in ndisc_recv_na() argument
878 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb); in ndisc_recv_na()
879 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_na()
880 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_na()
882 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_na()
885 struct net_device *dev = skb->dev; in ndisc_recv_na()
889 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_na()
919 if (skb->pkt_type != PACKET_LOOPBACK in ndisc_recv_na()
933 if (skb->pkt_type != PACKET_LOOPBACK) in ndisc_recv_na()
980 static void ndisc_recv_rs(struct sk_buff *skb) in ndisc_recv_rs() argument
982 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb); in ndisc_recv_rs()
983 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); in ndisc_recv_rs()
986 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_rs()
990 if (skb->len < sizeof(*rs_msg)) in ndisc_recv_rs()
993 idev = __in6_dev_get(skb->dev); in ndisc_recv_rs()
1018 skb->dev); in ndisc_recv_rs()
1023 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); in ndisc_recv_rs()
1038 struct sk_buff *skb; in ndisc_ra_useropt() local
1047 skb = nlmsg_new(msg_size, GFP_ATOMIC); in ndisc_ra_useropt()
1048 if (!skb) { in ndisc_ra_useropt()
1053 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0); in ndisc_ra_useropt()
1067 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr)) in ndisc_ra_useropt()
1069 nlmsg_end(skb, nlh); in ndisc_ra_useropt()
1071 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC); in ndisc_ra_useropt()
1075 nlmsg_free(skb); in ndisc_ra_useropt()
1081 static void ndisc_router_discovery(struct sk_buff *skb) in ndisc_router_discovery() argument
1083 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb); in ndisc_router_discovery()
1096 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - in ndisc_router_discovery()
1101 __func__, skb->dev->name); in ndisc_router_discovery()
1102 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_router_discovery()
1112 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { in ndisc_router_discovery()
1122 in6_dev = __in6_dev_get(skb->dev); in ndisc_router_discovery()
1125 skb->dev->name); in ndisc_router_discovery()
1137 __func__, skb->dev->name); in ndisc_router_discovery()
1143 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1146 __func__, skb->dev->name); in ndisc_router_discovery()
1177 __func__, skb->dev->name); in ndisc_router_discovery()
1185 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1189 skb->dev->name); in ndisc_router_discovery()
1203 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev); in ndisc_router_discovery()
1206 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1221 rt, lifetime, skb->dev->name); in ndisc_router_discovery()
1225 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref); in ndisc_router_discovery()
1233 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1310 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1311 skb->dev, 1); in ndisc_router_discovery()
1316 skb->dev); in ndisc_router_discovery()
1333 __func__, skb->dev->name); in ndisc_router_discovery()
1339 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1343 skb->dev->name); in ndisc_router_discovery()
1354 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT && in ndisc_router_discovery()
1363 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3, in ndisc_router_discovery()
1364 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1373 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1376 __func__, skb->dev->name); in ndisc_router_discovery()
1386 addrconf_prefix_rcv(skb->dev, (u8 *)p, in ndisc_router_discovery()
1399 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { in ndisc_router_discovery()
1407 rt6_mtu_change(skb->dev, mtu); in ndisc_router_discovery()
1416 ndisc_ra_useropt(skb, p); in ndisc_router_discovery()
1429 static void ndisc_redirect_rcv(struct sk_buff *skb) in ndisc_redirect_rcv() argument
1433 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb); in ndisc_redirect_rcv()
1434 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_redirect_rcv()
1438 switch (skb->ndisc_nodetype) { in ndisc_redirect_rcv()
1447 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_redirect_rcv()
1457 ip6_redirect_no_header(skb, dev_net(skb->dev), in ndisc_redirect_rcv()
1458 skb->dev->ifindex, 0); in ndisc_redirect_rcv()
1464 if (!pskb_pull(skb, hdr - skb_transport_header(skb))) in ndisc_redirect_rcv()
1467 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0); in ndisc_redirect_rcv()
1470 static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb, in ndisc_fill_redirect_hdr_option() argument
1474 u8 *opt = skb_put(skb, rd_len); in ndisc_fill_redirect_hdr_option()
1484 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target) in ndisc_send_redirect() argument
1486 struct net_device *dev = skb->dev; in ndisc_send_redirect()
1508 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && in ndisc_send_redirect()
1516 &saddr_buf, &ipv6_hdr(skb)->saddr, oif); in ndisc_send_redirect()
1518 if (oif != skb->dev->ifindex) in ndisc_send_redirect()
1537 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1); in ndisc_send_redirect()
1545 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target); in ndisc_send_redirect()
1566 skb->len + 8); in ndisc_send_redirect()
1580 .dest = ipv6_hdr(skb)->daddr, in ndisc_send_redirect()
1595 ndisc_fill_redirect_hdr_option(buff, skb, rd_len); in ndisc_send_redirect()
1598 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf); in ndisc_send_redirect()
1605 static void pndisc_redo(struct sk_buff *skb) in pndisc_redo() argument
1607 ndisc_recv_ns(skb); in pndisc_redo()
1608 kfree_skb(skb); in pndisc_redo()
1611 static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb) in ndisc_suppress_frag_ndisc() argument
1613 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ndisc_suppress_frag_ndisc()
1617 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED && in ndisc_suppress_frag_ndisc()
1625 int ndisc_rcv(struct sk_buff *skb) in ndisc_rcv() argument
1629 if (ndisc_suppress_frag_ndisc(skb)) in ndisc_rcv()
1632 if (skb_linearize(skb)) in ndisc_rcv()
1635 msg = (struct nd_msg *)skb_transport_header(skb); in ndisc_rcv()
1637 __skb_push(skb, skb->data - skb_transport_header(skb)); in ndisc_rcv()
1639 if (ipv6_hdr(skb)->hop_limit != 255) { in ndisc_rcv()
1641 ipv6_hdr(skb)->hop_limit); in ndisc_rcv()
1651 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); in ndisc_rcv()
1655 ndisc_recv_ns(skb); in ndisc_rcv()
1659 ndisc_recv_na(skb); in ndisc_rcv()
1663 ndisc_recv_rs(skb); in ndisc_rcv()
1667 ndisc_router_discovery(skb); in ndisc_rcv()
1671 ndisc_redirect_rcv(skb); in ndisc_rcv()