Lines Matching refs:skb
126 static void vrf_tx_error(struct net_device *vrf_dev, struct sk_buff *skb) in vrf_tx_error() argument
129 kfree_skb(skb); in vrf_tx_error()
358 static int vrf_local_xmit(struct sk_buff *skb, struct net_device *dev, in vrf_local_xmit() argument
361 unsigned int len = skb->len; in vrf_local_xmit()
363 skb_orphan(skb); in vrf_local_xmit()
365 skb_dst_set(skb, dst); in vrf_local_xmit()
370 skb->pkt_type = PACKET_LOOPBACK; in vrf_local_xmit()
372 skb->protocol = eth_type_trans(skb, dev); in vrf_local_xmit()
374 if (likely(__netif_rx(skb) == NET_RX_SUCCESS)) in vrf_local_xmit()
382 static void vrf_nf_set_untracked(struct sk_buff *skb) in vrf_nf_set_untracked() argument
384 if (skb_get_nfct(skb) == 0) in vrf_nf_set_untracked()
385 nf_ct_set(skb, NULL, IP_CT_UNTRACKED); in vrf_nf_set_untracked()
388 static void vrf_nf_reset_ct(struct sk_buff *skb) in vrf_nf_reset_ct() argument
390 if (skb_get_nfct(skb) == IP_CT_UNTRACKED) in vrf_nf_reset_ct()
391 nf_reset_ct(skb); in vrf_nf_reset_ct()
396 struct sk_buff *skb) in vrf_ip6_local_out() argument
400 vrf_nf_reset_ct(skb); in vrf_ip6_local_out()
403 sk, skb, NULL, skb_dst(skb)->dev, dst_output); in vrf_ip6_local_out()
406 err = dst_output(net, sk, skb); in vrf_ip6_local_out()
411 static netdev_tx_t vrf_process_v6_outbound(struct sk_buff *skb, in vrf_process_v6_outbound() argument
415 struct net *net = dev_net(skb->dev); in vrf_process_v6_outbound()
421 if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct ipv6hdr))) in vrf_process_v6_outbound()
424 iph = ipv6_hdr(skb); in vrf_process_v6_outbound()
433 fl6.flowi6_mark = skb->mark; in vrf_process_v6_outbound()
440 skb_dst_drop(skb); in vrf_process_v6_outbound()
446 return vrf_local_xmit(skb, dev, dst); in vrf_process_v6_outbound()
448 skb_dst_set(skb, dst); in vrf_process_v6_outbound()
451 __skb_pull(skb, skb_network_offset(skb)); in vrf_process_v6_outbound()
453 memset(IP6CB(skb), 0, sizeof(*IP6CB(skb))); in vrf_process_v6_outbound()
454 ret = vrf_ip6_local_out(net, skb->sk, skb); in vrf_process_v6_outbound()
462 vrf_tx_error(dev, skb); in vrf_process_v6_outbound()
466 static netdev_tx_t vrf_process_v6_outbound(struct sk_buff *skb, in vrf_process_v6_outbound() argument
469 vrf_tx_error(dev, skb); in vrf_process_v6_outbound()
476 struct sk_buff *skb) in vrf_ip_local_out() argument
480 vrf_nf_reset_ct(skb); in vrf_ip_local_out()
483 skb, NULL, skb_dst(skb)->dev, dst_output); in vrf_ip_local_out()
485 err = dst_output(net, sk, skb); in vrf_ip_local_out()
490 static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, in vrf_process_v4_outbound() argument
499 if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct iphdr))) in vrf_process_v4_outbound()
502 ip4h = ip_hdr(skb); in vrf_process_v4_outbound()
518 skb_dst_drop(skb); in vrf_process_v4_outbound()
524 return vrf_local_xmit(skb, vrf_dev, &rt->dst); in vrf_process_v4_outbound()
526 skb_dst_set(skb, &rt->dst); in vrf_process_v4_outbound()
529 __skb_pull(skb, skb_network_offset(skb)); in vrf_process_v4_outbound()
532 ip4h->saddr = inet_select_addr(skb_dst(skb)->dev, 0, in vrf_process_v4_outbound()
536 memset(IPCB(skb), 0, sizeof(*IPCB(skb))); in vrf_process_v4_outbound()
537 ret = vrf_ip_local_out(dev_net(skb_dst(skb)->dev), skb->sk, skb); in vrf_process_v4_outbound()
546 vrf_tx_error(vrf_dev, skb); in vrf_process_v4_outbound()
550 static netdev_tx_t is_ip_tx_frame(struct sk_buff *skb, struct net_device *dev) in is_ip_tx_frame() argument
552 switch (skb->protocol) { in is_ip_tx_frame()
554 return vrf_process_v4_outbound(skb, dev); in is_ip_tx_frame()
556 return vrf_process_v6_outbound(skb, dev); in is_ip_tx_frame()
558 vrf_tx_error(dev, skb); in is_ip_tx_frame()
563 static netdev_tx_t vrf_xmit(struct sk_buff *skb, struct net_device *dev) in vrf_xmit() argument
565 unsigned int len = skb->len; in vrf_xmit()
568 ret = is_ip_tx_frame(skb, dev); in vrf_xmit()
577 static void vrf_finish_direct(struct sk_buff *skb) in vrf_finish_direct() argument
579 struct net_device *vrf_dev = skb->dev; in vrf_finish_direct()
582 likely(skb_headroom(skb) >= ETH_HLEN)) { in vrf_finish_direct()
583 struct ethhdr *eth = skb_push(skb, ETH_HLEN); in vrf_finish_direct()
587 eth->h_proto = skb->protocol; in vrf_finish_direct()
590 dev_queue_xmit_nit(skb, vrf_dev); in vrf_finish_direct()
593 skb_pull(skb, ETH_HLEN); in vrf_finish_direct()
596 vrf_nf_reset_ct(skb); in vrf_finish_direct()
602 struct sk_buff *skb) in vrf_finish_output6() argument
604 struct dst_entry *dst = skb_dst(skb); in vrf_finish_output6()
610 vrf_nf_reset_ct(skb); in vrf_finish_output6()
612 skb->protocol = htons(ETH_P_IPV6); in vrf_finish_output6()
613 skb->dev = dev; in vrf_finish_output6()
616 nexthop = rt6_nexthop(dst_rt6_info(dst), &ipv6_hdr(skb)->daddr); in vrf_finish_output6()
621 sock_confirm_neigh(skb, neigh); in vrf_finish_output6()
622 ret = neigh_output(neigh, skb, false); in vrf_finish_output6()
630 kfree_skb(skb); in vrf_finish_output6()
635 static int vrf_output6(struct net *net, struct sock *sk, struct sk_buff *skb) in vrf_output6() argument
638 net, sk, skb, NULL, skb_dst(skb)->dev, in vrf_output6()
640 !(IP6CB(skb)->flags & IP6SKB_REROUTED)); in vrf_output6()
648 struct sk_buff *skb) in vrf_ip6_out_redirect() argument
665 vrf_tx_error(vrf_dev, skb); in vrf_ip6_out_redirect()
669 skb_dst_drop(skb); in vrf_ip6_out_redirect()
670 skb_dst_set(skb, dst); in vrf_ip6_out_redirect()
672 return skb; in vrf_ip6_out_redirect()
676 struct sk_buff *skb) in vrf_output6_direct_finish() argument
678 vrf_finish_direct(skb); in vrf_output6_direct_finish()
680 return vrf_ip6_local_out(net, sk, skb); in vrf_output6_direct_finish()
684 struct sk_buff *skb) in vrf_output6_direct() argument
688 skb->protocol = htons(ETH_P_IPV6); in vrf_output6_direct()
690 if (!(IPCB(skb)->flags & IPSKB_REROUTED)) in vrf_output6_direct()
691 err = nf_hook(NFPROTO_IPV6, NF_INET_POST_ROUTING, net, sk, skb, in vrf_output6_direct()
692 NULL, skb->dev, vrf_output6_direct_finish); in vrf_output6_direct()
695 vrf_finish_direct(skb); in vrf_output6_direct()
701 struct sk_buff *skb) in vrf_ip6_out_direct_finish() argument
705 err = vrf_output6_direct(net, sk, skb); in vrf_ip6_out_direct_finish()
707 err = vrf_ip6_local_out(net, sk, skb); in vrf_ip6_out_direct_finish()
714 struct sk_buff *skb) in vrf_ip6_out_direct() argument
719 skb->dev = vrf_dev; in vrf_ip6_out_direct()
722 skb, NULL, vrf_dev, vrf_ip6_out_direct_finish); in vrf_ip6_out_direct()
725 err = vrf_output6_direct(net, sk, skb); in vrf_ip6_out_direct()
728 return skb; in vrf_ip6_out_direct()
735 struct sk_buff *skb) in vrf_ip6_out() argument
738 if (rt6_need_strict(&ipv6_hdr(skb)->daddr)) in vrf_ip6_out()
739 return skb; in vrf_ip6_out()
741 vrf_nf_set_untracked(skb); in vrf_ip6_out()
744 IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) in vrf_ip6_out()
745 return vrf_ip6_out_direct(vrf_dev, sk, skb); in vrf_ip6_out()
747 return vrf_ip6_out_redirect(vrf_dev, skb); in vrf_ip6_out()
804 struct sk_buff *skb) in vrf_ip6_out() argument
806 return skb; in vrf_ip6_out()
820 static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) in vrf_finish_output() argument
822 struct dst_entry *dst = skb_dst(skb); in vrf_finish_output()
829 vrf_nf_reset_ct(skb); in vrf_finish_output()
832 if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { in vrf_finish_output()
833 skb = skb_expand_head(skb, hh_len); in vrf_finish_output()
834 if (!skb) { in vrf_finish_output()
842 neigh = ip_neigh_for_gw(rt, skb, &is_v6gw); in vrf_finish_output()
846 sock_confirm_neigh(skb, neigh); in vrf_finish_output()
848 ret = neigh_output(neigh, skb, is_v6gw); in vrf_finish_output()
854 vrf_tx_error(skb->dev, skb); in vrf_finish_output()
858 static int vrf_output(struct net *net, struct sock *sk, struct sk_buff *skb) in vrf_output() argument
860 struct net_device *dev = skb_dst(skb)->dev; in vrf_output()
862 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len); in vrf_output()
864 skb->dev = dev; in vrf_output()
865 skb->protocol = htons(ETH_P_IP); in vrf_output()
868 net, sk, skb, NULL, dev, in vrf_output()
870 !(IPCB(skb)->flags & IPSKB_REROUTED)); in vrf_output()
878 struct sk_buff *skb) in vrf_ip_out_redirect() argument
895 vrf_tx_error(vrf_dev, skb); in vrf_ip_out_redirect()
899 skb_dst_drop(skb); in vrf_ip_out_redirect()
900 skb_dst_set(skb, dst); in vrf_ip_out_redirect()
902 return skb; in vrf_ip_out_redirect()
906 struct sk_buff *skb) in vrf_output_direct_finish() argument
908 vrf_finish_direct(skb); in vrf_output_direct_finish()
910 return vrf_ip_local_out(net, sk, skb); in vrf_output_direct_finish()
914 struct sk_buff *skb) in vrf_output_direct() argument
918 skb->protocol = htons(ETH_P_IP); in vrf_output_direct()
920 if (!(IPCB(skb)->flags & IPSKB_REROUTED)) in vrf_output_direct()
921 err = nf_hook(NFPROTO_IPV4, NF_INET_POST_ROUTING, net, sk, skb, in vrf_output_direct()
922 NULL, skb->dev, vrf_output_direct_finish); in vrf_output_direct()
925 vrf_finish_direct(skb); in vrf_output_direct()
931 struct sk_buff *skb) in vrf_ip_out_direct_finish() argument
935 err = vrf_output_direct(net, sk, skb); in vrf_ip_out_direct_finish()
937 err = vrf_ip_local_out(net, sk, skb); in vrf_ip_out_direct_finish()
944 struct sk_buff *skb) in vrf_ip_out_direct() argument
949 skb->dev = vrf_dev; in vrf_ip_out_direct()
952 skb, NULL, vrf_dev, vrf_ip_out_direct_finish); in vrf_ip_out_direct()
955 err = vrf_output_direct(net, sk, skb); in vrf_ip_out_direct()
958 return skb; in vrf_ip_out_direct()
965 struct sk_buff *skb) in vrf_ip_out() argument
968 if (ipv4_is_multicast(ip_hdr(skb)->daddr) || in vrf_ip_out()
969 ipv4_is_lbcast(ip_hdr(skb)->daddr)) in vrf_ip_out()
970 return skb; in vrf_ip_out()
972 vrf_nf_set_untracked(skb); in vrf_ip_out()
975 IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED) in vrf_ip_out()
976 return vrf_ip_out_direct(vrf_dev, sk, skb); in vrf_ip_out()
978 return vrf_ip_out_redirect(vrf_dev, skb); in vrf_ip_out()
984 struct sk_buff *skb, in vrf_l3_out() argument
989 return vrf_ip_out(vrf_dev, sk, skb); in vrf_l3_out()
991 return vrf_ip6_out(vrf_dev, sk, skb); in vrf_l3_out()
994 return skb; in vrf_l3_out()
1169 static int vrf_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb) in vrf_rcv_finish() argument
1171 kfree_skb(skb); in vrf_rcv_finish()
1176 struct sk_buff *skb, in vrf_rcv_nfhook() argument
1181 if (nf_hook(pf, hook, net, NULL, skb, dev, NULL, vrf_rcv_finish) != 1) in vrf_rcv_nfhook()
1182 skb = NULL; /* kfree_skb(skb) handled by nf code */ in vrf_rcv_nfhook()
1184 return skb; in vrf_rcv_nfhook()
1187 static int vrf_prepare_mac_header(struct sk_buff *skb, in vrf_prepare_mac_header() argument
1196 err = skb_cow_head(skb, LL_RESERVED_SPACE(vrf_dev)); in vrf_prepare_mac_header()
1201 __skb_push(skb, ETH_HLEN); in vrf_prepare_mac_header()
1202 eth = (struct ethhdr *)skb->data; in vrf_prepare_mac_header()
1204 skb_reset_mac_header(skb); in vrf_prepare_mac_header()
1205 skb_reset_mac_len(skb); in vrf_prepare_mac_header()
1218 skb->protocol = eth->h_proto; in vrf_prepare_mac_header()
1219 skb->pkt_type = PACKET_HOST; in vrf_prepare_mac_header()
1221 skb_postpush_rcsum(skb, skb->data, ETH_HLEN); in vrf_prepare_mac_header()
1223 skb_pull_inline(skb, ETH_HLEN); in vrf_prepare_mac_header()
1233 static int vrf_add_mac_header_if_unset(struct sk_buff *skb, in vrf_add_mac_header_if_unset() argument
1237 if (skb_mac_header_was_set(skb) && dev_has_header(orig_dev)) in vrf_add_mac_header_if_unset()
1240 return vrf_prepare_mac_header(skb, vrf_dev, proto); in vrf_add_mac_header_if_unset()
1249 static bool ipv6_ndisc_frame(const struct sk_buff *skb) in ipv6_ndisc_frame() argument
1251 const struct ipv6hdr *iph = ipv6_hdr(skb); in ipv6_ndisc_frame()
1258 icmph = skb_header_pointer(skb, sizeof(*iph), in ipv6_ndisc_frame()
1282 const struct sk_buff *skb, in vrf_ip6_route_lookup() argument
1287 return ip6_pol_route(net, vrf->fib6_table, ifindex, fl6, skb, flags); in vrf_ip6_route_lookup()
1290 static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev, in vrf_ip6_input_dst() argument
1293 const struct ipv6hdr *iph = ipv6_hdr(skb); in vrf_ip6_input_dst()
1296 .flowi6_mark = skb->mark, in vrf_ip6_input_dst()
1305 skb_dst_drop(skb); in vrf_ip6_input_dst()
1307 rt6 = vrf_ip6_route_lookup(net, vrf_dev, &fl6, ifindex, skb, in vrf_ip6_input_dst()
1315 skb_dst_set(skb, &rt6->dst); in vrf_ip6_input_dst()
1319 struct sk_buff *skb) in vrf_ip6_rcv() argument
1321 int orig_iif = skb->skb_iif; in vrf_ip6_rcv()
1322 bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr); in vrf_ip6_rcv()
1323 bool is_ndisc = ipv6_ndisc_frame(skb); in vrf_ip6_rcv()
1330 if (skb->pkt_type == PACKET_LOOPBACK || (need_strict && !is_ndisc)) { in vrf_ip6_rcv()
1331 skb->dev = vrf_dev; in vrf_ip6_rcv()
1332 skb->skb_iif = vrf_dev->ifindex; in vrf_ip6_rcv()
1333 IP6CB(skb)->flags |= IP6SKB_L3SLAVE; in vrf_ip6_rcv()
1335 if (skb->pkt_type == PACKET_LOOPBACK) in vrf_ip6_rcv()
1336 skb->pkt_type = PACKET_HOST; in vrf_ip6_rcv()
1338 vrf_ip6_input_dst(skb, vrf_dev, orig_iif); in vrf_ip6_rcv()
1345 struct net_device *orig_dev = skb->dev; in vrf_ip6_rcv()
1347 dev_dstats_rx_add(vrf_dev, skb->len); in vrf_ip6_rcv()
1348 skb->dev = vrf_dev; in vrf_ip6_rcv()
1349 skb->skb_iif = vrf_dev->ifindex; in vrf_ip6_rcv()
1354 err = vrf_add_mac_header_if_unset(skb, vrf_dev, in vrf_ip6_rcv()
1358 skb_push(skb, skb->mac_len); in vrf_ip6_rcv()
1359 dev_queue_xmit_nit(skb, vrf_dev); in vrf_ip6_rcv()
1360 skb_pull(skb, skb->mac_len); in vrf_ip6_rcv()
1364 IP6CB(skb)->flags |= IP6SKB_L3SLAVE; in vrf_ip6_rcv()
1368 vrf_ip6_input_dst(skb, vrf_dev, orig_iif); in vrf_ip6_rcv()
1370 skb = vrf_rcv_nfhook(NFPROTO_IPV6, NF_INET_PRE_ROUTING, skb, vrf_dev); in vrf_ip6_rcv()
1372 return skb; in vrf_ip6_rcv()
1377 struct sk_buff *skb) in vrf_ip6_rcv() argument
1379 return skb; in vrf_ip6_rcv()
1384 struct sk_buff *skb) in vrf_ip_rcv() argument
1386 struct net_device *orig_dev = skb->dev; in vrf_ip_rcv()
1388 skb->dev = vrf_dev; in vrf_ip_rcv()
1389 skb->skb_iif = vrf_dev->ifindex; in vrf_ip_rcv()
1390 IPCB(skb)->flags |= IPSKB_L3SLAVE; in vrf_ip_rcv()
1392 if (ipv4_is_multicast(ip_hdr(skb)->daddr)) in vrf_ip_rcv()
1398 if (skb->pkt_type == PACKET_LOOPBACK) { in vrf_ip_rcv()
1399 skb->pkt_type = PACKET_HOST; in vrf_ip_rcv()
1403 dev_dstats_rx_add(vrf_dev, skb->len); in vrf_ip_rcv()
1408 err = vrf_add_mac_header_if_unset(skb, vrf_dev, ETH_P_IP, in vrf_ip_rcv()
1411 skb_push(skb, skb->mac_len); in vrf_ip_rcv()
1412 dev_queue_xmit_nit(skb, vrf_dev); in vrf_ip_rcv()
1413 skb_pull(skb, skb->mac_len); in vrf_ip_rcv()
1417 skb = vrf_rcv_nfhook(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, vrf_dev); in vrf_ip_rcv()
1419 return skb; in vrf_ip_rcv()
1424 struct sk_buff *skb, in vrf_l3_rcv() argument
1429 return vrf_ip_rcv(vrf_dev, skb); in vrf_l3_rcv()
1431 return vrf_ip6_rcv(vrf_dev, skb); in vrf_l3_rcv()
1434 return skb; in vrf_l3_rcv()
1507 struct sk_buff *skb; in vrf_fib_rule() local
1514 skb = nlmsg_new(vrf_fib_rule_nl_size(), GFP_KERNEL); in vrf_fib_rule()
1515 if (!skb) in vrf_fib_rule()
1518 nlh = nlmsg_put(skb, 0, 0, 0, sizeof(*frh), 0); in vrf_fib_rule()
1530 if (nla_put_u8(skb, FRA_PROTOCOL, RTPROT_KERNEL)) in vrf_fib_rule()
1533 if (nla_put_u8(skb, FRA_L3MDEV, 1)) in vrf_fib_rule()
1536 if (nla_put_u32(skb, FRA_PRIORITY, FIB_RULE_PREF)) in vrf_fib_rule()
1539 nlmsg_end(skb, nlh); in vrf_fib_rule()
1542 err = fib_newrule(dev_net(dev), skb, nlh, NULL, true); in vrf_fib_rule()
1546 err = fib_delrule(dev_net(dev), skb, nlh, NULL, true); in vrf_fib_rule()
1550 nlmsg_free(skb); in vrf_fib_rule()
1555 nlmsg_free(skb); in vrf_fib_rule()
1743 static int vrf_fillinfo(struct sk_buff *skb, in vrf_fillinfo() argument
1748 return nla_put_u32(skb, IFLA_VRF_TABLE, vrf->tb_id); in vrf_fillinfo()
1757 static int vrf_fill_slave_info(struct sk_buff *skb, in vrf_fill_slave_info() argument
1763 if (nla_put_u32(skb, IFLA_VRF_PORT_TABLE, vrf->tb_id)) in vrf_fill_slave_info()