Hi Peter,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bpf-next/master]

url:    
https://github.com/0day-ci/linux/commits/Peter-Oskolkov/bpf-add-BPF_LWT_ENCAP_IP-option-to-bpf_lwt_push_encap/20190209-030743
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
config: x86_64-randconfig-j0-02040958 (attached as .config)
compiler: gcc-4.9 (Debian 4.9.4-2) 4.9.4
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   net//core/lwt_bpf.c: In function 'bpf_lwt_xmit_reroute':
>> net//core/lwt_bpf.c:216:10: warning: missing braces around initializer 
>> [-Wmissing-braces]
      struct flowi4 fl4 = {0};
             ^
   net//core/lwt_bpf.c:216:10: warning: (near initialization for 
'fl4.__fl_common') [-Wmissing-braces]

vim +216 net//core/lwt_bpf.c

   184  
   185  static int bpf_lwt_xmit_reroute(struct sk_buff *skb)
   186  {
   187          struct net_device *l3mdev = 
l3mdev_master_dev_rcu(skb_dst(skb)->dev);
   188          int oif = l3mdev ? l3mdev->ifindex : 0;
   189          struct dst_entry *dst = NULL;
   190          struct sock *sk;
   191          struct net *net;
   192          bool ipv4;
   193          int err;
   194  
   195          if (skb->protocol == htons(ETH_P_IP)) {
   196                  ipv4 = true;
   197          } else if (skb->protocol == htons(ETH_P_IPV6)) {
   198                  ipv4 = false;
   199          } else {
   200                  pr_warn_once("BPF_LWT_REROUTE xmit: unsupported proto 
%d\n",
   201                               skb->protocol);
   202                  return -EINVAL;
   203          }
   204  
   205          sk = sk_to_full_sk(skb->sk);
   206          if (sk) {
   207                  if (sk->sk_bound_dev_if)
   208                          oif = sk->sk_bound_dev_if;
   209                  net = sock_net(sk);
   210          } else {
   211                  net = dev_net(skb_dst(skb)->dev);
   212          }
   213  
   214          if (ipv4) {
   215                  struct iphdr *iph = ip_hdr(skb);
 > 216                  struct flowi4 fl4 = {0};
   217                  struct rtable *rt;
   218  
   219                  fl4.flowi4_oif = oif;
   220                  fl4.flowi4_mark = skb->mark;
   221                  fl4.flowi4_uid = sock_net_uid(net, sk);
   222                  fl4.flowi4_tos = RT_TOS(iph->tos);
   223                  fl4.flowi4_flags = FLOWI_FLAG_ANYSRC;
   224                  fl4.flowi4_proto = iph->protocol;
   225                  fl4.daddr = iph->daddr;
   226                  fl4.saddr = iph->saddr;
   227  
   228                  rt = ip_route_output_key(net, &fl4);
   229                  if (IS_ERR(rt) || rt->dst.error)
   230                          return -EINVAL;
   231                  dst = &rt->dst;
   232          } else {
   233  #if IS_BUILTIN(CONFIG_IPV6)
   234                  struct ipv6hdr *iph6 = ipv6_hdr(skb);
   235                  struct flowi6 fl6 = {0};
   236  
   237                  fl6.flowi6_oif = oif;
   238                  fl6.flowi6_mark = skb->mark;
   239                  fl6.flowi6_uid = sock_net_uid(net, sk);
   240                  fl6.flowlabel = ip6_flowinfo(iph6);
   241                  fl6.flowi6_proto = iph6->nexthdr;
   242                  fl6.daddr = iph6->daddr;
   243                  fl6.saddr = iph6->saddr;
   244  
   245                  dst = ip6_route_output(net, skb->sk, &fl6);
   246                  if (IS_ERR(dst) || dst->error)
   247                          return -EINVAL;
   248  #else
   249                  pr_warn_once("BPF_LWT_REROUTE xmit: IPV6 not 
built-in\n");
   250                  return -EINVAL;
   251  #endif
   252          }
   253  
   254          /* Although skb header was reserved in bpf_lwt_push_ip_encap(), 
it
   255           * was done for the previous dst, so we are doing it here 
again, in
   256           * case the new dst needs much more space. The call below is a 
noop
   257           * if there is enough header space in skb.
   258           */
   259          err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
   260          if (unlikely(err))
   261                  return err;
   262  
   263          skb_dst_drop(skb);
   264          skb_dst_set(skb, dst);
   265  
   266          err = dst_output(dev_net(skb_dst(skb)->dev), skb->sk, skb);
   267          if (unlikely(err))
   268                  return err;
   269  
   270          /* ip[6]_finish_output2 understand LWTUNNEL_XMIT_DONE */
   271          return LWTUNNEL_XMIT_DONE;
   272  }
   273  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to