tree: https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git testing/warray-bounds head: 4695107c157dd670a5fc1b1d3ccbfdc440caca24 commit: 06f7d86a7f517e6ce30162d18a7eef3ed192282a [1/10] Makefile: Enable -Warray-bounds config: x86_64-randconfig-r026-20210414 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce (this is a W=1 build): # https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git/commit/?id=06f7d86a7f517e6ce30162d18a7eef3ed192282a git remote add gustavoars-linux https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git git fetch --no-tags gustavoars-linux testing/warray-bounds git checkout 06f7d86a7f517e6ce30162d18a7eef3ed192282a # save the attached .config to linux build tree make W=1 W=1 ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <l...@intel.com> All warnings (new ones prefixed by >>): In function '__skb_flow_bpf_to_target', inlined from '__skb_flow_dissect' at net/core/flow_dissector.c:1014:4: >> net/core/flow_dissector.c:835:3: warning: 'memcpy' offset [33, 48] from the >> object at 'flow_keys' is out of the bounds of referenced subobject >> 'ipv6_src' with type '__u32[4]' {aka 'unsigned int[4]'} at offset 16 >> [-Warray-bounds] 835 | memcpy(&key_addrs->v6addrs, &flow_keys->ipv6_src, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 836 | sizeof(key_addrs->v6addrs)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- net/ethtool/ioctl.c: In function 'store_link_ksettings_for_user.constprop': >> net/ethtool/ioctl.c:492:2: warning: 'memcpy' offset [49, 84] from the object >> at 'link_usettings' is out of the bounds of referenced subobject 'base' with >> type 'struct ethtool_link_settings' at offset 0 [-Warray-bounds] 492 | memcpy(&link_usettings.base, &from->base, sizeof(link_usettings)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vim +835 net/core/flow_dissector.c 1eed4dfb81b193 Tom Herbert 2017-09-01 793 d58e468b1112dc Petar Penkov 2018-09-14 794 static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys, d58e468b1112dc Petar Penkov 2018-09-14 795 struct flow_dissector *flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 796 void *target_container) d58e468b1112dc Petar Penkov 2018-09-14 797 { 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 798 struct flow_dissector_key_ports *key_ports = NULL; d58e468b1112dc Petar Penkov 2018-09-14 799 struct flow_dissector_key_control *key_control; d58e468b1112dc Petar Penkov 2018-09-14 800 struct flow_dissector_key_basic *key_basic; d58e468b1112dc Petar Penkov 2018-09-14 801 struct flow_dissector_key_addrs *key_addrs; 71c99e32b92615 Stanislav Fomichev 2019-07-25 802 struct flow_dissector_key_tags *key_tags; d58e468b1112dc Petar Penkov 2018-09-14 803 d58e468b1112dc Petar Penkov 2018-09-14 804 key_control = skb_flow_dissector_target(flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 805 FLOW_DISSECTOR_KEY_CONTROL, d58e468b1112dc Petar Penkov 2018-09-14 806 target_container); d58e468b1112dc Petar Penkov 2018-09-14 807 key_control->thoff = flow_keys->thoff; d58e468b1112dc Petar Penkov 2018-09-14 808 if (flow_keys->is_frag) d58e468b1112dc Petar Penkov 2018-09-14 809 key_control->flags |= FLOW_DIS_IS_FRAGMENT; d58e468b1112dc Petar Penkov 2018-09-14 810 if (flow_keys->is_first_frag) d58e468b1112dc Petar Penkov 2018-09-14 811 key_control->flags |= FLOW_DIS_FIRST_FRAG; d58e468b1112dc Petar Penkov 2018-09-14 812 if (flow_keys->is_encap) d58e468b1112dc Petar Penkov 2018-09-14 813 key_control->flags |= FLOW_DIS_ENCAPSULATION; d58e468b1112dc Petar Penkov 2018-09-14 814 d58e468b1112dc Petar Penkov 2018-09-14 815 key_basic = skb_flow_dissector_target(flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 816 FLOW_DISSECTOR_KEY_BASIC, d58e468b1112dc Petar Penkov 2018-09-14 817 target_container); d58e468b1112dc Petar Penkov 2018-09-14 818 key_basic->n_proto = flow_keys->n_proto; d58e468b1112dc Petar Penkov 2018-09-14 819 key_basic->ip_proto = flow_keys->ip_proto; d58e468b1112dc Petar Penkov 2018-09-14 820 d58e468b1112dc Petar Penkov 2018-09-14 821 if (flow_keys->addr_proto == ETH_P_IP && d58e468b1112dc Petar Penkov 2018-09-14 822 dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_IPV4_ADDRS)) { d58e468b1112dc Petar Penkov 2018-09-14 823 key_addrs = skb_flow_dissector_target(flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 824 FLOW_DISSECTOR_KEY_IPV4_ADDRS, d58e468b1112dc Petar Penkov 2018-09-14 825 target_container); d58e468b1112dc Petar Penkov 2018-09-14 826 key_addrs->v4addrs.src = flow_keys->ipv4_src; d58e468b1112dc Petar Penkov 2018-09-14 827 key_addrs->v4addrs.dst = flow_keys->ipv4_dst; d58e468b1112dc Petar Penkov 2018-09-14 828 key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS; d58e468b1112dc Petar Penkov 2018-09-14 829 } else if (flow_keys->addr_proto == ETH_P_IPV6 && d58e468b1112dc Petar Penkov 2018-09-14 830 dissector_uses_key(flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 831 FLOW_DISSECTOR_KEY_IPV6_ADDRS)) { d58e468b1112dc Petar Penkov 2018-09-14 832 key_addrs = skb_flow_dissector_target(flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 833 FLOW_DISSECTOR_KEY_IPV6_ADDRS, d58e468b1112dc Petar Penkov 2018-09-14 834 target_container); d58e468b1112dc Petar Penkov 2018-09-14 @835 memcpy(&key_addrs->v6addrs, &flow_keys->ipv6_src, d58e468b1112dc Petar Penkov 2018-09-14 836 sizeof(key_addrs->v6addrs)); d58e468b1112dc Petar Penkov 2018-09-14 837 key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; d58e468b1112dc Petar Penkov 2018-09-14 838 } d58e468b1112dc Petar Penkov 2018-09-14 839 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 840 if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) d58e468b1112dc Petar Penkov 2018-09-14 841 key_ports = skb_flow_dissector_target(flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 842 FLOW_DISSECTOR_KEY_PORTS, d58e468b1112dc Petar Penkov 2018-09-14 843 target_container); 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 844 else if (dissector_uses_key(flow_dissector, 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 845 FLOW_DISSECTOR_KEY_PORTS_RANGE)) 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 846 key_ports = skb_flow_dissector_target(flow_dissector, 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 847 FLOW_DISSECTOR_KEY_PORTS_RANGE, 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 848 target_container); 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 849 59fb9b62fb6c92 Yoshiki Komachi 2020-01-17 850 if (key_ports) { d58e468b1112dc Petar Penkov 2018-09-14 851 key_ports->src = flow_keys->sport; d58e468b1112dc Petar Penkov 2018-09-14 852 key_ports->dst = flow_keys->dport; d58e468b1112dc Petar Penkov 2018-09-14 853 } 71c99e32b92615 Stanislav Fomichev 2019-07-25 854 71c99e32b92615 Stanislav Fomichev 2019-07-25 855 if (dissector_uses_key(flow_dissector, 71c99e32b92615 Stanislav Fomichev 2019-07-25 856 FLOW_DISSECTOR_KEY_FLOW_LABEL)) { 71c99e32b92615 Stanislav Fomichev 2019-07-25 857 key_tags = skb_flow_dissector_target(flow_dissector, 71c99e32b92615 Stanislav Fomichev 2019-07-25 858 FLOW_DISSECTOR_KEY_FLOW_LABEL, 71c99e32b92615 Stanislav Fomichev 2019-07-25 859 target_container); 71c99e32b92615 Stanislav Fomichev 2019-07-25 860 key_tags->flow_label = ntohl(flow_keys->flow_label); 71c99e32b92615 Stanislav Fomichev 2019-07-25 861 } d58e468b1112dc Petar Penkov 2018-09-14 862 } d58e468b1112dc Petar Penkov 2018-09-14 863 089b19a9204fc0 Stanislav Fomichev 2019-04-22 864 bool bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx, 086f95682114fd Stanislav Fomichev 2019-07-25 865 __be16 proto, int nhoff, int hlen, unsigned int flags) 089b19a9204fc0 Stanislav Fomichev 2019-04-22 866 { 089b19a9204fc0 Stanislav Fomichev 2019-04-22 867 struct bpf_flow_keys *flow_keys = ctx->flow_keys; 089b19a9204fc0 Stanislav Fomichev 2019-04-22 868 u32 result; c8aa703822bf81 Stanislav Fomichev 2019-01-28 869 c8aa703822bf81 Stanislav Fomichev 2019-01-28 870 /* Pass parameters to the BPF program */ c8aa703822bf81 Stanislav Fomichev 2019-01-28 871 memset(flow_keys, 0, sizeof(*flow_keys)); 089b19a9204fc0 Stanislav Fomichev 2019-04-22 872 flow_keys->n_proto = proto; 089b19a9204fc0 Stanislav Fomichev 2019-04-22 873 flow_keys->nhoff = nhoff; c8aa703822bf81 Stanislav Fomichev 2019-01-28 874 flow_keys->thoff = flow_keys->nhoff; c8aa703822bf81 Stanislav Fomichev 2019-01-28 875 086f95682114fd Stanislav Fomichev 2019-07-25 876 BUILD_BUG_ON((int)BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG != 086f95682114fd Stanislav Fomichev 2019-07-25 877 (int)FLOW_DISSECTOR_F_PARSE_1ST_FRAG); 086f95682114fd Stanislav Fomichev 2019-07-25 878 BUILD_BUG_ON((int)BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL != 086f95682114fd Stanislav Fomichev 2019-07-25 879 (int)FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL); 086f95682114fd Stanislav Fomichev 2019-07-25 880 BUILD_BUG_ON((int)BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP != 086f95682114fd Stanislav Fomichev 2019-07-25 881 (int)FLOW_DISSECTOR_F_STOP_AT_ENCAP); 086f95682114fd Stanislav Fomichev 2019-07-25 882 flow_keys->flags = flags; 086f95682114fd Stanislav Fomichev 2019-07-25 883 3d9f773cf2876c David Miller 2020-02-24 884 result = bpf_prog_run_pin_on_cpu(prog, ctx); c8aa703822bf81 Stanislav Fomichev 2019-01-28 885 089b19a9204fc0 Stanislav Fomichev 2019-04-22 886 flow_keys->nhoff = clamp_t(u16, flow_keys->nhoff, nhoff, hlen); c8aa703822bf81 Stanislav Fomichev 2019-01-28 887 flow_keys->thoff = clamp_t(u16, flow_keys->thoff, 089b19a9204fc0 Stanislav Fomichev 2019-04-22 888 flow_keys->nhoff, hlen); c8aa703822bf81 Stanislav Fomichev 2019-01-28 889 c8aa703822bf81 Stanislav Fomichev 2019-01-28 890 return result == BPF_OK; c8aa703822bf81 Stanislav Fomichev 2019-01-28 891 } c8aa703822bf81 Stanislav Fomichev 2019-01-28 892 453a940ea725d6 WANG Cong 2014-08-25 893 /** 453a940ea725d6 WANG Cong 2014-08-25 894 * __skb_flow_dissect - extract the flow_keys struct and return it 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 895 * @net: associated network namespace, derived from @skb if NULL 453a940ea725d6 WANG Cong 2014-08-25 896 * @skb: sk_buff to extract the flow from, can be NULL if the rest are specified 06635a35d13d42 Jiri Pirko 2015-05-12 897 * @flow_dissector: list of keys to dissect 06635a35d13d42 Jiri Pirko 2015-05-12 898 * @target_container: target structure to put dissected values into 453a940ea725d6 WANG Cong 2014-08-25 899 * @data: raw buffer pointer to the packet, if NULL use skb->data 453a940ea725d6 WANG Cong 2014-08-25 900 * @proto: protocol for which to get the flow, if @data is NULL use skb->protocol 453a940ea725d6 WANG Cong 2014-08-25 901 * @nhoff: network header offset, if @data is NULL use skb_network_offset(skb) 453a940ea725d6 WANG Cong 2014-08-25 902 * @hlen: packet header length, if @data is NULL use skb_headlen(skb) d79b3bafabc27c Bart Van Assche 2019-03-25 903 * @flags: flags that control the dissection process, e.g. 1cc26450a855aa Stanislav Fomichev 2019-05-31 904 * FLOW_DISSECTOR_F_STOP_AT_ENCAP. 453a940ea725d6 WANG Cong 2014-08-25 905 * 06635a35d13d42 Jiri Pirko 2015-05-12 906 * The function will try to retrieve individual keys into target specified 06635a35d13d42 Jiri Pirko 2015-05-12 907 * by flow_dissector from either the skbuff or a raw buffer specified by the 06635a35d13d42 Jiri Pirko 2015-05-12 908 * rest parameters. 06635a35d13d42 Jiri Pirko 2015-05-12 909 * 06635a35d13d42 Jiri Pirko 2015-05-12 910 * Caller must take care of zeroing target container memory. 453a940ea725d6 WANG Cong 2014-08-25 911 */ 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 912 bool __skb_flow_dissect(const struct net *net, 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 913 const struct sk_buff *skb, 06635a35d13d42 Jiri Pirko 2015-05-12 914 struct flow_dissector *flow_dissector, f96533cded173b Alexander Lobakin 2021-03-14 915 void *target_container, const void *data, f96533cded173b Alexander Lobakin 2021-03-14 916 __be16 proto, int nhoff, int hlen, unsigned int flags) 0744dd00c1b1be Eric Dumazet 2011-11-28 917 { 42aecaa9bb2bd5 Tom Herbert 2015-06-04 918 struct flow_dissector_key_control *key_control; 06635a35d13d42 Jiri Pirko 2015-05-12 919 struct flow_dissector_key_basic *key_basic; 06635a35d13d42 Jiri Pirko 2015-05-12 920 struct flow_dissector_key_addrs *key_addrs; d34af823ff401c Tom Herbert 2015-06-04 921 struct flow_dissector_key_tags *key_tags; f6a66927692e30 Hadar Hen Zion 2016-08-17 922 struct flow_dissector_key_vlan *key_vlan; 3a1214e8b06317 Tom Herbert 2017-09-01 923 enum flow_dissect_ret fdret; 24c590e3b0f9ee Jianbo Liu 2018-07-06 924 enum flow_dissector_key_id dissector_vlan = FLOW_DISSECTOR_KEY_MAX; 58cff782cc55eb Guillaume Nault 2020-05-26 925 bool mpls_el = false; 58cff782cc55eb Guillaume Nault 2020-05-26 926 int mpls_lse = 0; 1eed4dfb81b193 Tom Herbert 2017-09-01 927 int num_hdrs = 0; 8e690ffdbcc7b5 Geert Uytterhoeven 2015-06-25 928 u8 ip_proto = 0; 34fad54c2537f7 Eric Dumazet 2016-11-09 929 bool ret; 0744dd00c1b1be Eric Dumazet 2011-11-28 930 690e36e726d00d David S. Miller 2014-08-23 931 if (!data) { 690e36e726d00d David S. Miller 2014-08-23 932 data = skb->data; d5709f7ab77679 Hadar Hen Zion 2016-08-17 933 proto = skb_vlan_tag_present(skb) ? d5709f7ab77679 Hadar Hen Zion 2016-08-17 934 skb->vlan_proto : skb->protocol; 453a940ea725d6 WANG Cong 2014-08-25 935 nhoff = skb_network_offset(skb); 690e36e726d00d David S. Miller 2014-08-23 936 hlen = skb_headlen(skb); 2d5716456404a1 John Crispin 2017-08-10 937 #if IS_ENABLED(CONFIG_NET_DSA) 8bef0af09a5415 Alexander Lobakin 2019-12-05 938 if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) && 8bef0af09a5415 Alexander Lobakin 2019-12-05 939 proto == htons(ETH_P_XDSA))) { 43e665287f931a John Crispin 2017-08-09 940 const struct dsa_device_ops *ops; 8bef0af09a5415 Alexander Lobakin 2019-12-05 941 int offset = 0; 43e665287f931a John Crispin 2017-08-09 942 43e665287f931a John Crispin 2017-08-09 943 ops = skb->dev->dsa_ptr->tag_ops; 54fec33582aa60 Vladimir Oltean 2020-09-26 944 /* Tail taggers don't break flow dissection */ 54fec33582aa60 Vladimir Oltean 2020-09-26 945 if (!ops->tail_tag) { 54fec33582aa60 Vladimir Oltean 2020-09-26 946 if (ops->flow_dissect) 2e8cb1b3db3843 Vladimir Oltean 2020-09-26 947 ops->flow_dissect(skb, &proto, &offset); 54fec33582aa60 Vladimir Oltean 2020-09-26 948 else 54fec33582aa60 Vladimir Oltean 2020-09-26 949 dsa_tag_generic_flow_dissect(skb, 54fec33582aa60 Vladimir Oltean 2020-09-26 950 &proto, 54fec33582aa60 Vladimir Oltean 2020-09-26 951 &offset); 43e665287f931a John Crispin 2017-08-09 952 hlen -= offset; 43e665287f931a John Crispin 2017-08-09 953 nhoff += offset; 43e665287f931a John Crispin 2017-08-09 954 } 43e665287f931a John Crispin 2017-08-09 955 } 2d5716456404a1 John Crispin 2017-08-10 956 #endif 690e36e726d00d David S. Miller 2014-08-23 957 } 690e36e726d00d David S. Miller 2014-08-23 958 42aecaa9bb2bd5 Tom Herbert 2015-06-04 959 /* It is ensured by skb_flow_dissector_init() that control key will 42aecaa9bb2bd5 Tom Herbert 2015-06-04 960 * be always present. 42aecaa9bb2bd5 Tom Herbert 2015-06-04 961 */ 42aecaa9bb2bd5 Tom Herbert 2015-06-04 962 key_control = skb_flow_dissector_target(flow_dissector, 42aecaa9bb2bd5 Tom Herbert 2015-06-04 963 FLOW_DISSECTOR_KEY_CONTROL, 42aecaa9bb2bd5 Tom Herbert 2015-06-04 964 target_container); 42aecaa9bb2bd5 Tom Herbert 2015-06-04 965 06635a35d13d42 Jiri Pirko 2015-05-12 966 /* It is ensured by skb_flow_dissector_init() that basic key will 06635a35d13d42 Jiri Pirko 2015-05-12 967 * be always present. 06635a35d13d42 Jiri Pirko 2015-05-12 968 */ 06635a35d13d42 Jiri Pirko 2015-05-12 969 key_basic = skb_flow_dissector_target(flow_dissector, 06635a35d13d42 Jiri Pirko 2015-05-12 970 FLOW_DISSECTOR_KEY_BASIC, 06635a35d13d42 Jiri Pirko 2015-05-12 971 target_container); 0744dd00c1b1be Eric Dumazet 2011-11-28 972 d0e13a1488ad30 Willem de Bruijn 2018-09-24 973 if (skb) { 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 974 if (!net) { d0e13a1488ad30 Willem de Bruijn 2018-09-24 975 if (skb->dev) 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 976 net = dev_net(skb->dev); d0e13a1488ad30 Willem de Bruijn 2018-09-24 977 else if (skb->sk) 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 978 net = sock_net(skb->sk); 9b52e3f267a683 Stanislav Fomichev 2019-04-22 979 } 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 980 } 3cbf4ffba5eeec Stanislav Fomichev 2019-04-22 981 9b52e3f267a683 Stanislav Fomichev 2019-04-22 982 WARN_ON_ONCE(!net); 9b52e3f267a683 Stanislav Fomichev 2019-04-22 983 if (net) { a3fd7ceee05431 Jakub Sitnicki 2020-05-31 984 enum netns_bpf_attach_type type = NETNS_BPF_FLOW_DISSECTOR; 695c12147a4018 Jakub Sitnicki 2020-06-25 985 struct bpf_prog_array *run_array; a3fd7ceee05431 Jakub Sitnicki 2020-05-31 986 9b52e3f267a683 Stanislav Fomichev 2019-04-22 987 rcu_read_lock(); 695c12147a4018 Jakub Sitnicki 2020-06-25 988 run_array = rcu_dereference(init_net.bpf.run_array[type]); 695c12147a4018 Jakub Sitnicki 2020-06-25 989 if (!run_array) 695c12147a4018 Jakub Sitnicki 2020-06-25 990 run_array = rcu_dereference(net->bpf.run_array[type]); a11c397c43d5b2 Stanislav Fomichev 2019-10-07 991 695c12147a4018 Jakub Sitnicki 2020-06-25 992 if (run_array) { 9b52e3f267a683 Stanislav Fomichev 2019-04-22 993 struct bpf_flow_keys flow_keys; 9b52e3f267a683 Stanislav Fomichev 2019-04-22 994 struct bpf_flow_dissector ctx = { 9b52e3f267a683 Stanislav Fomichev 2019-04-22 995 .flow_keys = &flow_keys, 9b52e3f267a683 Stanislav Fomichev 2019-04-22 996 .data = data, 9b52e3f267a683 Stanislav Fomichev 2019-04-22 997 .data_end = data + hlen, 9b52e3f267a683 Stanislav Fomichev 2019-04-22 998 }; 9b52e3f267a683 Stanislav Fomichev 2019-04-22 999 __be16 n_proto = proto; 695c12147a4018 Jakub Sitnicki 2020-06-25 1000 struct bpf_prog *prog; 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1001 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1002 if (skb) { 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1003 ctx.skb = skb; 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1004 /* we can't use 'proto' in the skb case 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1005 * because it might be set to skb->vlan_proto 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1006 * which has been pulled from the data 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1007 */ 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1008 n_proto = skb->protocol; 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1009 } 9b52e3f267a683 Stanislav Fomichev 2019-04-22 1010 695c12147a4018 Jakub Sitnicki 2020-06-25 1011 prog = READ_ONCE(run_array->items[0].prog); 695c12147a4018 Jakub Sitnicki 2020-06-25 1012 ret = bpf_flow_dissect(prog, &ctx, n_proto, nhoff, 086f95682114fd Stanislav Fomichev 2019-07-25 1013 hlen, flags); d58e468b1112dc Petar Penkov 2018-09-14 @1014 __skb_flow_bpf_to_target(&flow_keys, flow_dissector, d58e468b1112dc Petar Penkov 2018-09-14 1015 target_container); d58e468b1112dc Petar Penkov 2018-09-14 1016 rcu_read_unlock(); c8aa703822bf81 Stanislav Fomichev 2019-01-28 1017 return ret; d58e468b1112dc Petar Penkov 2018-09-14 1018 } d58e468b1112dc Petar Penkov 2018-09-14 1019 rcu_read_unlock(); c8aa703822bf81 Stanislav Fomichev 2019-01-28 1020 } d58e468b1112dc Petar Penkov 2018-09-14 1021 20a17bf6c04e3e David S. Miller 2015-09-01 1022 if (dissector_uses_key(flow_dissector, 67a900cc0436d7 Jiri Pirko 2015-05-12 1023 FLOW_DISSECTOR_KEY_ETH_ADDRS)) { 67a900cc0436d7 Jiri Pirko 2015-05-12 1024 struct ethhdr *eth = eth_hdr(skb); 67a900cc0436d7 Jiri Pirko 2015-05-12 1025 struct flow_dissector_key_eth_addrs *key_eth_addrs; 67a900cc0436d7 Jiri Pirko 2015-05-12 1026 67a900cc0436d7 Jiri Pirko 2015-05-12 1027 key_eth_addrs = skb_flow_dissector_target(flow_dissector, 67a900cc0436d7 Jiri Pirko 2015-05-12 1028 FLOW_DISSECTOR_KEY_ETH_ADDRS, 67a900cc0436d7 Jiri Pirko 2015-05-12 1029 target_container); 67a900cc0436d7 Jiri Pirko 2015-05-12 1030 memcpy(key_eth_addrs, ð->h_dest, sizeof(*key_eth_addrs)); 67a900cc0436d7 Jiri Pirko 2015-05-12 1031 } 67a900cc0436d7 Jiri Pirko 2015-05-12 1032 c5ef188e931869 Jiri Pirko 2017-03-06 1033 proto_again: 3a1214e8b06317 Tom Herbert 2017-09-01 1034 fdret = FLOW_DISSECT_RET_CONTINUE; 3a1214e8b06317 Tom Herbert 2017-09-01 1035 0744dd00c1b1be Eric Dumazet 2011-11-28 1036 switch (proto) { 2b8837aeaaa0bb Joe Perches 2014-03-12 1037 case htons(ETH_P_IP): { 0744dd00c1b1be Eric Dumazet 2011-11-28 1038 const struct iphdr *iph; 0744dd00c1b1be Eric Dumazet 2011-11-28 1039 struct iphdr _iph; 3a1214e8b06317 Tom Herbert 2017-09-01 1040 690e36e726d00d David S. Miller 2014-08-23 1041 iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph); 3a1214e8b06317 Tom Herbert 2017-09-01 1042 if (!iph || iph->ihl < 5) { 3a1214e8b06317 Tom Herbert 2017-09-01 1043 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1044 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1045 } 3a1214e8b06317 Tom Herbert 2017-09-01 1046 3797d3e8462efd Eric Dumazet 2013-11-07 1047 nhoff += iph->ihl * 4; 0744dd00c1b1be Eric Dumazet 2011-11-28 1048 3797d3e8462efd Eric Dumazet 2013-11-07 1049 ip_proto = iph->protocol; 3797d3e8462efd Eric Dumazet 2013-11-07 1050 918c023f29ab2d Alexander Duyck 2016-02-24 1051 if (dissector_uses_key(flow_dissector, 918c023f29ab2d Alexander Duyck 2016-02-24 1052 FLOW_DISSECTOR_KEY_IPV4_ADDRS)) { 06635a35d13d42 Jiri Pirko 2015-05-12 1053 key_addrs = skb_flow_dissector_target(flow_dissector, 918c023f29ab2d Alexander Duyck 2016-02-24 1054 FLOW_DISSECTOR_KEY_IPV4_ADDRS, 918c023f29ab2d Alexander Duyck 2016-02-24 1055 target_container); 918c023f29ab2d Alexander Duyck 2016-02-24 1056 c3f8324188fa80 Tom Herbert 2015-06-04 1057 memcpy(&key_addrs->v4addrs, &iph->saddr, c3f8324188fa80 Tom Herbert 2015-06-04 1058 sizeof(key_addrs->v4addrs)); c3f8324188fa80 Tom Herbert 2015-06-04 1059 key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS; 918c023f29ab2d Alexander Duyck 2016-02-24 1060 } 807e165dc44fd9 Tom Herbert 2015-09-01 1061 d2126838050ccd Davide Caratti 2021-02-12 1062 __skb_flow_dissect_ipv4(skb, flow_dissector, d2126838050ccd Davide Caratti 2021-02-12 1063 target_container, data, iph); d2126838050ccd Davide Caratti 2021-02-12 1064 807e165dc44fd9 Tom Herbert 2015-09-01 1065 if (ip_is_fragment(iph)) { 4b36993d3df083 David S. Miller 2015-09-01 1066 key_control->flags |= FLOW_DIS_IS_FRAGMENT; 807e165dc44fd9 Tom Herbert 2015-09-01 1067 807e165dc44fd9 Tom Herbert 2015-09-01 1068 if (iph->frag_off & htons(IP_OFFSET)) { 3a1214e8b06317 Tom Herbert 2017-09-01 1069 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1070 break; 807e165dc44fd9 Tom Herbert 2015-09-01 1071 } else { 4b36993d3df083 David S. Miller 2015-09-01 1072 key_control->flags |= FLOW_DIS_FIRST_FRAG; 3a1214e8b06317 Tom Herbert 2017-09-01 1073 if (!(flags & 3a1214e8b06317 Tom Herbert 2017-09-01 1074 FLOW_DISSECTOR_F_PARSE_1ST_FRAG)) { 3a1214e8b06317 Tom Herbert 2017-09-01 1075 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1076 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1077 } 807e165dc44fd9 Tom Herbert 2015-09-01 1078 } 807e165dc44fd9 Tom Herbert 2015-09-01 1079 } 807e165dc44fd9 Tom Herbert 2015-09-01 1080 0744dd00c1b1be Eric Dumazet 2011-11-28 1081 break; 0744dd00c1b1be Eric Dumazet 2011-11-28 1082 } 2b8837aeaaa0bb Joe Perches 2014-03-12 1083 case htons(ETH_P_IPV6): { 0744dd00c1b1be Eric Dumazet 2011-11-28 1084 const struct ipv6hdr *iph; 0744dd00c1b1be Eric Dumazet 2011-11-28 1085 struct ipv6hdr _iph; 19469a873bafd4 Tom Herbert 2014-07-01 1086 690e36e726d00d David S. Miller 2014-08-23 1087 iph = __skb_header_pointer(skb, nhoff, sizeof(_iph), data, hlen, &_iph); 3a1214e8b06317 Tom Herbert 2017-09-01 1088 if (!iph) { 3a1214e8b06317 Tom Herbert 2017-09-01 1089 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1090 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1091 } 0744dd00c1b1be Eric Dumazet 2011-11-28 1092 0744dd00c1b1be Eric Dumazet 2011-11-28 1093 ip_proto = iph->nexthdr; 0744dd00c1b1be Eric Dumazet 2011-11-28 1094 nhoff += sizeof(struct ipv6hdr); 19469a873bafd4 Tom Herbert 2014-07-01 1095 20a17bf6c04e3e David S. Miller 2015-09-01 1096 if (dissector_uses_key(flow_dissector, b924933cbbfbdc Jiri Pirko 2015-05-12 1097 FLOW_DISSECTOR_KEY_IPV6_ADDRS)) { b3c3106ce3f464 Alexander Duyck 2016-02-24 1098 key_addrs = skb_flow_dissector_target(flow_dissector, b924933cbbfbdc Jiri Pirko 2015-05-12 1099 FLOW_DISSECTOR_KEY_IPV6_ADDRS, b924933cbbfbdc Jiri Pirko 2015-05-12 1100 target_container); b924933cbbfbdc Jiri Pirko 2015-05-12 1101 b3c3106ce3f464 Alexander Duyck 2016-02-24 1102 memcpy(&key_addrs->v6addrs, &iph->saddr, b3c3106ce3f464 Alexander Duyck 2016-02-24 1103 sizeof(key_addrs->v6addrs)); c3f8324188fa80 Tom Herbert 2015-06-04 1104 key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; b924933cbbfbdc Jiri Pirko 2015-05-12 1105 } 87ee9e52ffeb16 Tom Herbert 2015-06-04 1106 461547f3158978 Alexander Duyck 2016-02-09 1107 if ((dissector_uses_key(flow_dissector, 461547f3158978 Alexander Duyck 2016-02-09 1108 FLOW_DISSECTOR_KEY_FLOW_LABEL) || 461547f3158978 Alexander Duyck 2016-02-09 1109 (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL)) && 461547f3158978 Alexander Duyck 2016-02-09 1110 ip6_flowlabel(iph)) { 461547f3158978 Alexander Duyck 2016-02-09 1111 __be32 flow_label = ip6_flowlabel(iph); 461547f3158978 Alexander Duyck 2016-02-09 1112 20a17bf6c04e3e David S. Miller 2015-09-01 1113 if (dissector_uses_key(flow_dissector, 87ee9e52ffeb16 Tom Herbert 2015-06-04 1114 FLOW_DISSECTOR_KEY_FLOW_LABEL)) { 87ee9e52ffeb16 Tom Herbert 2015-06-04 1115 key_tags = skb_flow_dissector_target(flow_dissector, 87ee9e52ffeb16 Tom Herbert 2015-06-04 1116 FLOW_DISSECTOR_KEY_FLOW_LABEL, 06635a35d13d42 Jiri Pirko 2015-05-12 1117 target_container); 87ee9e52ffeb16 Tom Herbert 2015-06-04 1118 key_tags->flow_label = ntohl(flow_label); 12c227ec89a70c Jiri Pirko 2015-05-22 1119 } 3a1214e8b06317 Tom Herbert 2017-09-01 1120 if (flags & FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL) { 3a1214e8b06317 Tom Herbert 2017-09-01 1121 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1122 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1123 } 19469a873bafd4 Tom Herbert 2014-07-01 1124 } 19469a873bafd4 Tom Herbert 2014-07-01 1125 518d8a2e9bad83 Or Gerlitz 2017-06-01 1126 __skb_flow_dissect_ipv6(skb, flow_dissector, 518d8a2e9bad83 Or Gerlitz 2017-06-01 1127 target_container, data, iph); 518d8a2e9bad83 Or Gerlitz 2017-06-01 1128 0744dd00c1b1be Eric Dumazet 2011-11-28 1129 break; 0744dd00c1b1be Eric Dumazet 2011-11-28 1130 } 2b8837aeaaa0bb Joe Perches 2014-03-12 1131 case htons(ETH_P_8021AD): 2b8837aeaaa0bb Joe Perches 2014-03-12 1132 case htons(ETH_P_8021Q): { 24c590e3b0f9ee Jianbo Liu 2018-07-06 1133 const struct vlan_hdr *vlan = NULL; bc72f3dd89e087 Arnd Bergmann 2016-10-24 1134 struct vlan_hdr _vlan; 2064c3d4c02026 Jianbo Liu 2018-07-06 1135 __be16 saved_vlan_tpid = proto; d5709f7ab77679 Hadar Hen Zion 2016-08-17 1136 24c590e3b0f9ee Jianbo Liu 2018-07-06 1137 if (dissector_vlan == FLOW_DISSECTOR_KEY_MAX && 24c590e3b0f9ee Jianbo Liu 2018-07-06 1138 skb && skb_vlan_tag_present(skb)) { d5709f7ab77679 Hadar Hen Zion 2016-08-17 1139 proto = skb->protocol; 24c590e3b0f9ee Jianbo Liu 2018-07-06 1140 } else { d5709f7ab77679 Hadar Hen Zion 2016-08-17 1141 vlan = __skb_header_pointer(skb, nhoff, sizeof(_vlan), d5709f7ab77679 Hadar Hen Zion 2016-08-17 1142 data, hlen, &_vlan); 3a1214e8b06317 Tom Herbert 2017-09-01 1143 if (!vlan) { 3a1214e8b06317 Tom Herbert 2017-09-01 1144 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1145 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1146 } 3a1214e8b06317 Tom Herbert 2017-09-01 1147 d5709f7ab77679 Hadar Hen Zion 2016-08-17 1148 proto = vlan->h_vlan_encapsulated_proto; d5709f7ab77679 Hadar Hen Zion 2016-08-17 1149 nhoff += sizeof(*vlan); 24c590e3b0f9ee Jianbo Liu 2018-07-06 1150 } 24c590e3b0f9ee Jianbo Liu 2018-07-06 1151 24c590e3b0f9ee Jianbo Liu 2018-07-06 1152 if (dissector_vlan == FLOW_DISSECTOR_KEY_MAX) { 24c590e3b0f9ee Jianbo Liu 2018-07-06 1153 dissector_vlan = FLOW_DISSECTOR_KEY_VLAN; 24c590e3b0f9ee Jianbo Liu 2018-07-06 1154 } else if (dissector_vlan == FLOW_DISSECTOR_KEY_VLAN) { 24c590e3b0f9ee Jianbo Liu 2018-07-06 1155 dissector_vlan = FLOW_DISSECTOR_KEY_CVLAN; 24c590e3b0f9ee Jianbo Liu 2018-07-06 1156 } else { 3a1214e8b06317 Tom Herbert 2017-09-01 1157 fdret = FLOW_DISSECT_RET_PROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1158 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1159 } 0744dd00c1b1be Eric Dumazet 2011-11-28 1160 24c590e3b0f9ee Jianbo Liu 2018-07-06 1161 if (dissector_uses_key(flow_dissector, dissector_vlan)) { f6a66927692e30 Hadar Hen Zion 2016-08-17 1162 key_vlan = skb_flow_dissector_target(flow_dissector, 24c590e3b0f9ee Jianbo Liu 2018-07-06 1163 dissector_vlan, d34af823ff401c Tom Herbert 2015-06-04 1164 target_container); d34af823ff401c Tom Herbert 2015-06-04 1165 24c590e3b0f9ee Jianbo Liu 2018-07-06 1166 if (!vlan) { f6a66927692e30 Hadar Hen Zion 2016-08-17 1167 key_vlan->vlan_id = skb_vlan_tag_get_id(skb); 9b319148cb34ec Michał Mirosław 2018-11-07 1168 key_vlan->vlan_priority = skb_vlan_tag_get_prio(skb); f6a66927692e30 Hadar Hen Zion 2016-08-17 1169 } else { f6a66927692e30 Hadar Hen Zion 2016-08-17 1170 key_vlan->vlan_id = ntohs(vlan->h_vlan_TCI) & d5709f7ab77679 Hadar Hen Zion 2016-08-17 1171 VLAN_VID_MASK; f6a66927692e30 Hadar Hen Zion 2016-08-17 1172 key_vlan->vlan_priority = f6a66927692e30 Hadar Hen Zion 2016-08-17 1173 (ntohs(vlan->h_vlan_TCI) & f6a66927692e30 Hadar Hen Zion 2016-08-17 1174 VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; f6a66927692e30 Hadar Hen Zion 2016-08-17 1175 } 2064c3d4c02026 Jianbo Liu 2018-07-06 1176 key_vlan->vlan_tpid = saved_vlan_tpid; d34af823ff401c Tom Herbert 2015-06-04 1177 } d34af823ff401c Tom Herbert 2015-06-04 1178 3a1214e8b06317 Tom Herbert 2017-09-01 1179 fdret = FLOW_DISSECT_RET_PROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1180 break; 0744dd00c1b1be Eric Dumazet 2011-11-28 1181 } 2b8837aeaaa0bb Joe Perches 2014-03-12 1182 case htons(ETH_P_PPP_SES): { 0744dd00c1b1be Eric Dumazet 2011-11-28 1183 struct { 0744dd00c1b1be Eric Dumazet 2011-11-28 1184 struct pppoe_hdr hdr; 0744dd00c1b1be Eric Dumazet 2011-11-28 1185 __be16 proto; 0744dd00c1b1be Eric Dumazet 2011-11-28 1186 } *hdr, _hdr; 690e36e726d00d David S. Miller 2014-08-23 1187 hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr); 3a1214e8b06317 Tom Herbert 2017-09-01 1188 if (!hdr) { 3a1214e8b06317 Tom Herbert 2017-09-01 1189 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1190 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1191 } 3a1214e8b06317 Tom Herbert 2017-09-01 1192 0744dd00c1b1be Eric Dumazet 2011-11-28 1193 proto = hdr->proto; 0744dd00c1b1be Eric Dumazet 2011-11-28 1194 nhoff += PPPOE_SES_HLEN; 0744dd00c1b1be Eric Dumazet 2011-11-28 1195 switch (proto) { 2b8837aeaaa0bb Joe Perches 2014-03-12 1196 case htons(PPP_IP): 3a1214e8b06317 Tom Herbert 2017-09-01 1197 proto = htons(ETH_P_IP); 3a1214e8b06317 Tom Herbert 2017-09-01 1198 fdret = FLOW_DISSECT_RET_PROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1199 break; 2b8837aeaaa0bb Joe Perches 2014-03-12 1200 case htons(PPP_IPV6): 3a1214e8b06317 Tom Herbert 2017-09-01 1201 proto = htons(ETH_P_IPV6); 3a1214e8b06317 Tom Herbert 2017-09-01 1202 fdret = FLOW_DISSECT_RET_PROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1203 break; 0744dd00c1b1be Eric Dumazet 2011-11-28 1204 default: 3a1214e8b06317 Tom Herbert 2017-09-01 1205 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1206 break; 0744dd00c1b1be Eric Dumazet 2011-11-28 1207 } 3a1214e8b06317 Tom Herbert 2017-09-01 1208 break; 0744dd00c1b1be Eric Dumazet 2011-11-28 1209 } 08bfc9cb76e26d Erik Hugne 2015-01-22 1210 case htons(ETH_P_TIPC): { 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1211 struct tipc_basic_hdr *hdr, _hdr; 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1212 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1213 hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1214 data, hlen, &_hdr); 3a1214e8b06317 Tom Herbert 2017-09-01 1215 if (!hdr) { 3a1214e8b06317 Tom Herbert 2017-09-01 1216 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1217 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1218 } 06635a35d13d42 Jiri Pirko 2015-05-12 1219 20a17bf6c04e3e David S. Miller 2015-09-01 1220 if (dissector_uses_key(flow_dissector, 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1221 FLOW_DISSECTOR_KEY_TIPC)) { 06635a35d13d42 Jiri Pirko 2015-05-12 1222 key_addrs = skb_flow_dissector_target(flow_dissector, 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1223 FLOW_DISSECTOR_KEY_TIPC, 06635a35d13d42 Jiri Pirko 2015-05-12 1224 target_container); 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1225 key_addrs->tipckey.key = tipc_hdr_rps_key(hdr); 8d6e79d3ce13e3 Jon Maloy 2017-11-08 1226 key_control->addr_type = FLOW_DISSECTOR_KEY_TIPC; 06635a35d13d42 Jiri Pirko 2015-05-12 1227 } 3a1214e8b06317 Tom Herbert 2017-09-01 1228 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1229 break; 08bfc9cb76e26d Erik Hugne 2015-01-22 1230 } b3baa0fbd02a1a Tom Herbert 2015-06-04 1231 b3baa0fbd02a1a Tom Herbert 2015-06-04 1232 case htons(ETH_P_MPLS_UC): 4a5d6c8b14b81e Jiri Pirko 2017-03-06 1233 case htons(ETH_P_MPLS_MC): 3a1214e8b06317 Tom Herbert 2017-09-01 1234 fdret = __skb_flow_dissect_mpls(skb, flow_dissector, 4a5d6c8b14b81e Jiri Pirko 2017-03-06 1235 target_container, data, 58cff782cc55eb Guillaume Nault 2020-05-26 1236 nhoff, hlen, mpls_lse, 58cff782cc55eb Guillaume Nault 2020-05-26 1237 &mpls_el); 58cff782cc55eb Guillaume Nault 2020-05-26 1238 nhoff += sizeof(struct mpls_label); 58cff782cc55eb Guillaume Nault 2020-05-26 1239 mpls_lse++; 3a1214e8b06317 Tom Herbert 2017-09-01 1240 break; 56193d1bce2b27 Alexander Duyck 2014-09-05 1241 case htons(ETH_P_FCOE): 3a1214e8b06317 Tom Herbert 2017-09-01 1242 if ((hlen - nhoff) < FCOE_HEADER_LEN) { 3a1214e8b06317 Tom Herbert 2017-09-01 1243 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1244 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1245 } 224516b3a798a0 Alexander Duyck 2016-02-24 1246 224516b3a798a0 Alexander Duyck 2016-02-24 1247 nhoff += FCOE_HEADER_LEN; 3a1214e8b06317 Tom Herbert 2017-09-01 1248 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1249 break; 55733350e5e8b7 Simon Horman 2017-01-11 1250 55733350e5e8b7 Simon Horman 2017-01-11 1251 case htons(ETH_P_ARP): 9bf881ffc5c0e6 Jiri Pirko 2017-03-06 1252 case htons(ETH_P_RARP): 3a1214e8b06317 Tom Herbert 2017-09-01 1253 fdret = __skb_flow_dissect_arp(skb, flow_dissector, 9bf881ffc5c0e6 Jiri Pirko 2017-03-06 1254 target_container, data, 3a1214e8b06317 Tom Herbert 2017-09-01 1255 nhoff, hlen); 3a1214e8b06317 Tom Herbert 2017-09-01 1256 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1257 5b0890a9720462 Sven Eckelmann 2017-12-21 1258 case htons(ETH_P_BATMAN): 5b0890a9720462 Sven Eckelmann 2017-12-21 1259 fdret = __skb_flow_dissect_batadv(skb, key_control, data, 5b0890a9720462 Sven Eckelmann 2017-12-21 1260 &proto, &nhoff, hlen, flags); 5b0890a9720462 Sven Eckelmann 2017-12-21 1261 break; 5b0890a9720462 Sven Eckelmann 2017-12-21 1262 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1263 case htons(ETH_P_1588): { 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1264 struct ptp_header *hdr, _hdr; 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1265 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1266 hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1267 hlen, &_hdr); 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1268 if (!hdr) { 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1269 fdret = FLOW_DISSECT_RET_OUT_BAD; 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1270 break; 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1271 } 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1272 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1273 nhoff += ntohs(hdr->message_length); 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1274 fdret = FLOW_DISSECT_RET_OUT_GOOD; 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1275 break; 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1276 } 4f1cc51f34886d Eran Ben Elisha 2021-01-12 1277 3a1214e8b06317 Tom Herbert 2017-09-01 1278 default: 3a1214e8b06317 Tom Herbert 2017-09-01 1279 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1280 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1281 } 3a1214e8b06317 Tom Herbert 2017-09-01 1282 3a1214e8b06317 Tom Herbert 2017-09-01 1283 /* Process result of proto processing */ 3a1214e8b06317 Tom Herbert 2017-09-01 1284 switch (fdret) { 9bf881ffc5c0e6 Jiri Pirko 2017-03-06 1285 case FLOW_DISSECT_RET_OUT_GOOD: 55733350e5e8b7 Simon Horman 2017-01-11 1286 goto out_good; 3a1214e8b06317 Tom Herbert 2017-09-01 1287 case FLOW_DISSECT_RET_PROTO_AGAIN: 1eed4dfb81b193 Tom Herbert 2017-09-01 1288 if (skb_flow_dissect_allowed(&num_hdrs)) 3a1214e8b06317 Tom Herbert 2017-09-01 1289 goto proto_again; 1eed4dfb81b193 Tom Herbert 2017-09-01 1290 goto out_good; 3a1214e8b06317 Tom Herbert 2017-09-01 1291 case FLOW_DISSECT_RET_CONTINUE: 3a1214e8b06317 Tom Herbert 2017-09-01 1292 case FLOW_DISSECT_RET_IPPROTO_AGAIN: 3a1214e8b06317 Tom Herbert 2017-09-01 1293 break; 9bf881ffc5c0e6 Jiri Pirko 2017-03-06 1294 case FLOW_DISSECT_RET_OUT_BAD: 7c92de8eaabfff Jiri Pirko 2017-03-06 1295 default: 9bf881ffc5c0e6 Jiri Pirko 2017-03-06 1296 goto out_bad; 55733350e5e8b7 Simon Horman 2017-01-11 1297 } 0744dd00c1b1be Eric Dumazet 2011-11-28 1298 6a74fcf426f51a Tom Herbert 2015-06-12 1299 ip_proto_again: 3a1214e8b06317 Tom Herbert 2017-09-01 1300 fdret = FLOW_DISSECT_RET_CONTINUE; 3a1214e8b06317 Tom Herbert 2017-09-01 1301 0744dd00c1b1be Eric Dumazet 2011-11-28 1302 switch (ip_proto) { 7c92de8eaabfff Jiri Pirko 2017-03-06 1303 case IPPROTO_GRE: 3a1214e8b06317 Tom Herbert 2017-09-01 1304 fdret = __skb_flow_dissect_gre(skb, key_control, flow_dissector, 7c92de8eaabfff Jiri Pirko 2017-03-06 1305 target_container, data, 3a1214e8b06317 Tom Herbert 2017-09-01 1306 &proto, &nhoff, &hlen, flags); 3a1214e8b06317 Tom Herbert 2017-09-01 1307 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1308 6a74fcf426f51a Tom Herbert 2015-06-12 1309 case NEXTHDR_HOP: 6a74fcf426f51a Tom Herbert 2015-06-12 1310 case NEXTHDR_ROUTING: 6a74fcf426f51a Tom Herbert 2015-06-12 1311 case NEXTHDR_DEST: { 6a74fcf426f51a Tom Herbert 2015-06-12 1312 u8 _opthdr[2], *opthdr; 6a74fcf426f51a Tom Herbert 2015-06-12 1313 6a74fcf426f51a Tom Herbert 2015-06-12 1314 if (proto != htons(ETH_P_IPV6)) 6a74fcf426f51a Tom Herbert 2015-06-12 1315 break; 6a74fcf426f51a Tom Herbert 2015-06-12 1316 6a74fcf426f51a Tom Herbert 2015-06-12 1317 opthdr = __skb_header_pointer(skb, nhoff, sizeof(_opthdr), 6a74fcf426f51a Tom Herbert 2015-06-12 1318 data, hlen, &_opthdr); 3a1214e8b06317 Tom Herbert 2017-09-01 1319 if (!opthdr) { 3a1214e8b06317 Tom Herbert 2017-09-01 1320 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1321 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1322 } 6a74fcf426f51a Tom Herbert 2015-06-12 1323 1e98a0f08abddd Eric Dumazet 2015-06-12 1324 ip_proto = opthdr[0]; 1e98a0f08abddd Eric Dumazet 2015-06-12 1325 nhoff += (opthdr[1] + 1) << 3; 6a74fcf426f51a Tom Herbert 2015-06-12 1326 3a1214e8b06317 Tom Herbert 2017-09-01 1327 fdret = FLOW_DISSECT_RET_IPPROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1328 break; 6a74fcf426f51a Tom Herbert 2015-06-12 1329 } b840f28b908da0 Tom Herbert 2015-09-01 1330 case NEXTHDR_FRAGMENT: { b840f28b908da0 Tom Herbert 2015-09-01 1331 struct frag_hdr _fh, *fh; b840f28b908da0 Tom Herbert 2015-09-01 1332 b840f28b908da0 Tom Herbert 2015-09-01 1333 if (proto != htons(ETH_P_IPV6)) b840f28b908da0 Tom Herbert 2015-09-01 1334 break; b840f28b908da0 Tom Herbert 2015-09-01 1335 b840f28b908da0 Tom Herbert 2015-09-01 1336 fh = __skb_header_pointer(skb, nhoff, sizeof(_fh), b840f28b908da0 Tom Herbert 2015-09-01 1337 data, hlen, &_fh); b840f28b908da0 Tom Herbert 2015-09-01 1338 3a1214e8b06317 Tom Herbert 2017-09-01 1339 if (!fh) { 3a1214e8b06317 Tom Herbert 2017-09-01 1340 fdret = FLOW_DISSECT_RET_OUT_BAD; 3a1214e8b06317 Tom Herbert 2017-09-01 1341 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1342 } b840f28b908da0 Tom Herbert 2015-09-01 1343 4b36993d3df083 David S. Miller 2015-09-01 1344 key_control->flags |= FLOW_DIS_IS_FRAGMENT; b840f28b908da0 Tom Herbert 2015-09-01 1345 b840f28b908da0 Tom Herbert 2015-09-01 1346 nhoff += sizeof(_fh); 43d2ccb3c122a4 Alexander Duyck 2016-02-24 1347 ip_proto = fh->nexthdr; b840f28b908da0 Tom Herbert 2015-09-01 1348 b840f28b908da0 Tom Herbert 2015-09-01 1349 if (!(fh->frag_off & htons(IP6_OFFSET))) { 4b36993d3df083 David S. Miller 2015-09-01 1350 key_control->flags |= FLOW_DIS_FIRST_FRAG; 3a1214e8b06317 Tom Herbert 2017-09-01 1351 if (flags & FLOW_DISSECTOR_F_PARSE_1ST_FRAG) { 3a1214e8b06317 Tom Herbert 2017-09-01 1352 fdret = FLOW_DISSECT_RET_IPPROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1353 break; b840f28b908da0 Tom Herbert 2015-09-01 1354 } 3a1214e8b06317 Tom Herbert 2017-09-01 1355 } 3a1214e8b06317 Tom Herbert 2017-09-01 1356 3a1214e8b06317 Tom Herbert 2017-09-01 1357 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1358 break; b840f28b908da0 Tom Herbert 2015-09-01 1359 } 0744dd00c1b1be Eric Dumazet 2011-11-28 1360 case IPPROTO_IPIP: fca418955148e4 Tom Herbert 2013-07-29 1361 proto = htons(ETH_P_IP); 823b96939578ea Tom Herbert 2015-09-01 1362 4b36993d3df083 David S. Miller 2015-09-01 1363 key_control->flags |= FLOW_DIS_ENCAPSULATION; 3a1214e8b06317 Tom Herbert 2017-09-01 1364 if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP) { 3a1214e8b06317 Tom Herbert 2017-09-01 1365 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1366 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1367 } 3a1214e8b06317 Tom Herbert 2017-09-01 1368 3a1214e8b06317 Tom Herbert 2017-09-01 1369 fdret = FLOW_DISSECT_RET_PROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1370 break; 823b96939578ea Tom Herbert 2015-09-01 1371 b438f940d3541f Tom Herbert 2013-07-29 1372 case IPPROTO_IPV6: b438f940d3541f Tom Herbert 2013-07-29 1373 proto = htons(ETH_P_IPV6); 823b96939578ea Tom Herbert 2015-09-01 1374 4b36993d3df083 David S. Miller 2015-09-01 1375 key_control->flags |= FLOW_DIS_ENCAPSULATION; 3a1214e8b06317 Tom Herbert 2017-09-01 1376 if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP) { 3a1214e8b06317 Tom Herbert 2017-09-01 1377 fdret = FLOW_DISSECT_RET_OUT_GOOD; 3a1214e8b06317 Tom Herbert 2017-09-01 1378 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1379 } 3a1214e8b06317 Tom Herbert 2017-09-01 1380 3a1214e8b06317 Tom Herbert 2017-09-01 1381 fdret = FLOW_DISSECT_RET_PROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1382 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1383 823b96939578ea Tom Herbert 2015-09-01 1384 b3baa0fbd02a1a Tom Herbert 2015-06-04 1385 case IPPROTO_MPLS: b3baa0fbd02a1a Tom Herbert 2015-06-04 1386 proto = htons(ETH_P_MPLS_UC); 3a1214e8b06317 Tom Herbert 2017-09-01 1387 fdret = FLOW_DISSECT_RET_PROTO_AGAIN; 3a1214e8b06317 Tom Herbert 2017-09-01 1388 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1389 ac4bb5de27010e Jiri Pirko 2017-05-23 1390 case IPPROTO_TCP: ac4bb5de27010e Jiri Pirko 2017-05-23 1391 __skb_flow_dissect_tcp(skb, flow_dissector, target_container, ac4bb5de27010e Jiri Pirko 2017-05-23 1392 data, nhoff, hlen); ac4bb5de27010e Jiri Pirko 2017-05-23 1393 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1394 3b336d6f4ec690 Matteo Croce 2019-10-29 1395 case IPPROTO_ICMP: 3b336d6f4ec690 Matteo Croce 2019-10-29 1396 case IPPROTO_ICMPV6: 3b336d6f4ec690 Matteo Croce 2019-10-29 1397 __skb_flow_dissect_icmp(skb, flow_dissector, target_container, 3b336d6f4ec690 Matteo Croce 2019-10-29 1398 data, nhoff, hlen); 3b336d6f4ec690 Matteo Croce 2019-10-29 1399 break; 3b336d6f4ec690 Matteo Croce 2019-10-29 1400 0744dd00c1b1be Eric Dumazet 2011-11-28 1401 default: 0744dd00c1b1be Eric Dumazet 2011-11-28 1402 break; 0744dd00c1b1be Eric Dumazet 2011-11-28 1403 } 0744dd00c1b1be Eric Dumazet 2011-11-28 1404 8ffb055beae585 Yoshiki Komachi 2019-12-03 1405 if (!(key_control->flags & FLOW_DIS_IS_FRAGMENT)) 8ffb055beae585 Yoshiki Komachi 2019-12-03 1406 __skb_flow_dissect_ports(skb, flow_dissector, target_container, 8ffb055beae585 Yoshiki Komachi 2019-12-03 1407 data, nhoff, ip_proto, hlen); 5af7fb6e3e92c2 Alexander Duyck 2014-10-10 1408 3a1214e8b06317 Tom Herbert 2017-09-01 1409 /* Process result of IP proto processing */ 3a1214e8b06317 Tom Herbert 2017-09-01 1410 switch (fdret) { 3a1214e8b06317 Tom Herbert 2017-09-01 1411 case FLOW_DISSECT_RET_PROTO_AGAIN: 1eed4dfb81b193 Tom Herbert 2017-09-01 1412 if (skb_flow_dissect_allowed(&num_hdrs)) 3a1214e8b06317 Tom Herbert 2017-09-01 1413 goto proto_again; 1eed4dfb81b193 Tom Herbert 2017-09-01 1414 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1415 case FLOW_DISSECT_RET_IPPROTO_AGAIN: 1eed4dfb81b193 Tom Herbert 2017-09-01 1416 if (skb_flow_dissect_allowed(&num_hdrs)) 3a1214e8b06317 Tom Herbert 2017-09-01 1417 goto ip_proto_again; 1eed4dfb81b193 Tom Herbert 2017-09-01 1418 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1419 case FLOW_DISSECT_RET_OUT_GOOD: 3a1214e8b06317 Tom Herbert 2017-09-01 1420 case FLOW_DISSECT_RET_CONTINUE: 3a1214e8b06317 Tom Herbert 2017-09-01 1421 break; 3a1214e8b06317 Tom Herbert 2017-09-01 1422 case FLOW_DISSECT_RET_OUT_BAD: 3a1214e8b06317 Tom Herbert 2017-09-01 1423 default: 3a1214e8b06317 Tom Herbert 2017-09-01 1424 goto out_bad; 3a1214e8b06317 Tom Herbert 2017-09-01 1425 } 3a1214e8b06317 Tom Herbert 2017-09-01 1426 a6e544b0a88b53 Tom Herbert 2015-09-01 1427 out_good: a6e544b0a88b53 Tom Herbert 2015-09-01 1428 ret = true; a6e544b0a88b53 Tom Herbert 2015-09-01 1429 34fad54c2537f7 Eric Dumazet 2016-11-09 1430 out: d0c081b49137cd Eric Dumazet 2018-01-17 1431 key_control->thoff = min_t(u16, nhoff, skb ? skb->len : hlen); a6e544b0a88b53 Tom Herbert 2015-09-01 1432 key_basic->n_proto = proto; a6e544b0a88b53 Tom Herbert 2015-09-01 1433 key_basic->ip_proto = ip_proto; a6e544b0a88b53 Tom Herbert 2015-09-01 1434 a6e544b0a88b53 Tom Herbert 2015-09-01 1435 return ret; 34fad54c2537f7 Eric Dumazet 2016-11-09 1436 34fad54c2537f7 Eric Dumazet 2016-11-09 1437 out_bad: 34fad54c2537f7 Eric Dumazet 2016-11-09 1438 ret = false; 34fad54c2537f7 Eric Dumazet 2016-11-09 1439 goto out; 0744dd00c1b1be Eric Dumazet 2011-11-28 1440 } 690e36e726d00d David S. Miller 2014-08-23 1441 EXPORT_SYMBOL(__skb_flow_dissect); 441d9d327f1e77 Cong Wang 2013-01-21 1442 :::::: The code at line 835 was first introduced by commit :::::: d58e468b1112dcd1d5193c0a89ff9f98b5a3e8b9 flow_dissector: implements flow dissector BPF hook :::::: TO: Petar Penkov <ppen...@google.com> :::::: CC: Alexei Starovoitov <a...@kernel.org> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org
.config.gz
Description: application/gzip