Lines Matching refs:skb

89 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
90 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
93 static void pndisc_redo(struct sk_buff *skb);
151 static void ndisc_fill_addr_option(struct sk_buff *skb, int type, void *data) in ndisc_fill_addr_option() argument
153 int pad = ndisc_addr_option_pad(skb->dev->type); in ndisc_fill_addr_option()
154 int data_len = skb->dev->addr_len; in ndisc_fill_addr_option()
155 int space = ndisc_opt_addr_space(skb->dev); in ndisc_fill_addr_option()
156 u8 *opt = skb_put(skb, space); in ndisc_fill_addr_option()
384 struct sk_buff *skb; in ndisc_alloc_skb() local
386 skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); in ndisc_alloc_skb()
387 if (!skb) { in ndisc_alloc_skb()
393 skb->protocol = htons(ETH_P_IPV6); in ndisc_alloc_skb()
394 skb->dev = dev; in ndisc_alloc_skb()
396 skb_reserve(skb, hlen + sizeof(struct ipv6hdr)); in ndisc_alloc_skb()
397 skb_reset_transport_header(skb); in ndisc_alloc_skb()
402 skb_set_owner_w(skb, sk); in ndisc_alloc_skb()
404 return skb; in ndisc_alloc_skb()
407 static void ip6_nd_hdr(struct sk_buff *skb, in ip6_nd_hdr() argument
414 skb_push(skb, sizeof(*hdr)); in ip6_nd_hdr()
415 skb_reset_network_header(skb); in ip6_nd_hdr()
416 hdr = ipv6_hdr(skb); in ip6_nd_hdr()
428 static void ndisc_send_skb(struct sk_buff *skb, in ndisc_send_skb() argument
432 struct dst_entry *dst = skb_dst(skb); in ndisc_send_skb()
433 struct net *net = dev_net(skb->dev); in ndisc_send_skb()
437 struct icmp6hdr *icmp6h = icmp6_hdr(skb); in ndisc_send_skb()
445 icmpv6_flow_init(sk, &fl6, type, saddr, daddr, skb->dev->ifindex); in ndisc_send_skb()
446 dst = icmp6_dst_alloc(skb->dev, &fl6); in ndisc_send_skb()
448 kfree_skb(skb); in ndisc_send_skb()
452 skb_dst_set(skb, dst); in ndisc_send_skb()
455 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len, in ndisc_send_skb()
458 skb->len, 0)); in ndisc_send_skb()
460 ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len); in ndisc_send_skb()
464 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in ndisc_send_skb()
466 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, sk, skb, in ndisc_send_skb()
482 struct sk_buff *skb; in ndisc_send_na() local
510 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen); in ndisc_send_na()
511 if (!skb) in ndisc_send_na()
514 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg)); in ndisc_send_na()
526 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR, in ndisc_send_na()
530 ndisc_send_skb(skb, daddr, src_addr); in ndisc_send_na()
558 struct sk_buff *skb; in ndisc_send_ns() local
576 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen); in ndisc_send_ns()
577 if (!skb) in ndisc_send_ns()
580 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg)); in ndisc_send_ns()
589 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR, in ndisc_send_ns()
592 ndisc_send_skb(skb, daddr, saddr); in ndisc_send_ns()
598 struct sk_buff *skb; in ndisc_send_rs() local
628 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen); in ndisc_send_rs()
629 if (!skb) in ndisc_send_rs()
632 msg = (struct rs_msg *)skb_put(skb, sizeof(*msg)); in ndisc_send_rs()
640 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR, in ndisc_send_rs()
643 ndisc_send_skb(skb, daddr, saddr); in ndisc_send_rs()
647 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb) in ndisc_error_report() argument
653 dst_link_failure(skb); in ndisc_error_report()
654 kfree_skb(skb); in ndisc_error_report()
659 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb) in ndisc_solicit() argument
667 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr, in ndisc_solicit()
670 saddr = &ipv6_hdr(skb)->saddr; in ndisc_solicit()
702 static void ndisc_recv_ns(struct sk_buff *skb) in ndisc_recv_ns() argument
704 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb); in ndisc_recv_ns()
705 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_ns()
706 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_ns()
708 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_ns()
711 struct net_device *dev = skb->dev; in ndisc_recv_ns()
719 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_ns()
803 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && in ndisc_recv_ns()
804 skb->pkt_type != PACKET_HOST && in ndisc_recv_ns()
814 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC); in ndisc_recv_ns()
862 static void ndisc_recv_na(struct sk_buff *skb) in ndisc_recv_na() argument
864 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb); in ndisc_recv_na()
865 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_na()
866 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_na()
868 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_na()
871 struct net_device *dev = skb->dev; in ndisc_recv_na()
875 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_na()
905 if (skb->pkt_type != PACKET_LOOPBACK in ndisc_recv_na()
919 if (skb->pkt_type != PACKET_LOOPBACK) in ndisc_recv_na()
966 static void ndisc_recv_rs(struct sk_buff *skb) in ndisc_recv_rs() argument
968 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb); in ndisc_recv_rs()
969 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); in ndisc_recv_rs()
972 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_rs()
976 if (skb->len < sizeof(*rs_msg)) in ndisc_recv_rs()
979 idev = __in6_dev_get(skb->dev); in ndisc_recv_rs()
1004 skb->dev); in ndisc_recv_rs()
1009 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); in ndisc_recv_rs()
1024 struct sk_buff *skb; in ndisc_ra_useropt() local
1033 skb = nlmsg_new(msg_size, GFP_ATOMIC); in ndisc_ra_useropt()
1034 if (!skb) { in ndisc_ra_useropt()
1039 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0); in ndisc_ra_useropt()
1053 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr)) in ndisc_ra_useropt()
1055 nlmsg_end(skb, nlh); in ndisc_ra_useropt()
1057 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC); in ndisc_ra_useropt()
1061 nlmsg_free(skb); in ndisc_ra_useropt()
1067 static void ndisc_router_discovery(struct sk_buff *skb) in ndisc_router_discovery() argument
1069 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb); in ndisc_router_discovery()
1080 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - in ndisc_router_discovery()
1085 __func__, skb->dev->name); in ndisc_router_discovery()
1086 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_router_discovery()
1096 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { in ndisc_router_discovery()
1106 in6_dev = __in6_dev_get(skb->dev); in ndisc_router_discovery()
1109 skb->dev->name); in ndisc_router_discovery()
1121 __func__, skb->dev->name); in ndisc_router_discovery()
1127 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1130 __func__, skb->dev->name); in ndisc_router_discovery()
1157 __func__, skb->dev->name); in ndisc_router_discovery()
1165 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1169 skb->dev->name); in ndisc_router_discovery()
1183 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev); in ndisc_router_discovery()
1186 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1201 rt, lifetime, skb->dev->name); in ndisc_router_discovery()
1205 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref); in ndisc_router_discovery()
1213 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1284 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1285 skb->dev, 1); in ndisc_router_discovery()
1290 skb->dev); in ndisc_router_discovery()
1307 __func__, skb->dev->name); in ndisc_router_discovery()
1313 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1317 skb->dev->name); in ndisc_router_discovery()
1328 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT && in ndisc_router_discovery()
1337 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3, in ndisc_router_discovery()
1338 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1347 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1350 __func__, skb->dev->name); in ndisc_router_discovery()
1360 addrconf_prefix_rcv(skb->dev, (u8 *)p, in ndisc_router_discovery()
1373 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { in ndisc_router_discovery()
1381 rt6_mtu_change(skb->dev, mtu); in ndisc_router_discovery()
1390 ndisc_ra_useropt(skb, p); in ndisc_router_discovery()
1403 static void ndisc_redirect_rcv(struct sk_buff *skb) in ndisc_redirect_rcv() argument
1407 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb); in ndisc_redirect_rcv()
1408 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_redirect_rcv()
1412 switch (skb->ndisc_nodetype) { in ndisc_redirect_rcv()
1421 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_redirect_rcv()
1431 ip6_redirect_no_header(skb, dev_net(skb->dev), in ndisc_redirect_rcv()
1432 skb->dev->ifindex, 0); in ndisc_redirect_rcv()
1438 if (!pskb_pull(skb, hdr - skb_transport_header(skb))) in ndisc_redirect_rcv()
1441 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0); in ndisc_redirect_rcv()
1444 static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb, in ndisc_fill_redirect_hdr_option() argument
1448 u8 *opt = skb_put(skb, rd_len); in ndisc_fill_redirect_hdr_option()
1458 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target) in ndisc_send_redirect() argument
1460 struct net_device *dev = skb->dev; in ndisc_send_redirect()
1481 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && in ndisc_send_redirect()
1489 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex); in ndisc_send_redirect()
1515 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target); in ndisc_send_redirect()
1536 skb->len + 8); in ndisc_send_redirect()
1550 .dest = ipv6_hdr(skb)->daddr, in ndisc_send_redirect()
1565 ndisc_fill_redirect_hdr_option(buff, skb, rd_len); in ndisc_send_redirect()
1568 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf); in ndisc_send_redirect()
1575 static void pndisc_redo(struct sk_buff *skb) in pndisc_redo() argument
1577 ndisc_recv_ns(skb); in pndisc_redo()
1578 kfree_skb(skb); in pndisc_redo()
1581 static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb) in ndisc_suppress_frag_ndisc() argument
1583 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ndisc_suppress_frag_ndisc()
1587 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED && in ndisc_suppress_frag_ndisc()
1595 int ndisc_rcv(struct sk_buff *skb) in ndisc_rcv() argument
1599 if (ndisc_suppress_frag_ndisc(skb)) in ndisc_rcv()
1602 if (skb_linearize(skb)) in ndisc_rcv()
1605 msg = (struct nd_msg *)skb_transport_header(skb); in ndisc_rcv()
1607 __skb_push(skb, skb->data - skb_transport_header(skb)); in ndisc_rcv()
1609 if (ipv6_hdr(skb)->hop_limit != 255) { in ndisc_rcv()
1611 ipv6_hdr(skb)->hop_limit); in ndisc_rcv()
1621 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); in ndisc_rcv()
1625 ndisc_recv_ns(skb); in ndisc_rcv()
1629 ndisc_recv_na(skb); in ndisc_rcv()
1633 ndisc_recv_rs(skb); in ndisc_rcv()
1637 ndisc_router_discovery(skb); in ndisc_rcv()
1641 ndisc_redirect_rcv(skb); in ndisc_rcv()