Hi Roopa,

Thank you for the patch! Perhaps something to improve:

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

url:    
https://github.com/0day-ci/linux/commits/Roopa-Prabhu/fib-rule-selftest/20180507-094538
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

   net/ipv4/route.c:1271:31: sparse: expression using sizeof(void)
   net/ipv4/route.c:1271:31: sparse: expression using sizeof(void)
   net/ipv4/route.c:1274:16: sparse: expression using sizeof(void)
   net/ipv4/route.c:1274:16: sparse: expression using sizeof(void)
   net/ipv4/route.c:1295:15: sparse: expression using sizeof(void)
   net/ipv4/route.c:688:38: sparse: expression using sizeof(void)
   net/ipv4/route.c:712:38: sparse: expression using sizeof(void)
   net/ipv4/route.c:782:46: sparse: incorrect type in argument 2 (different 
base types) @@    expected unsigned int [unsigned] [usertype] key @@    got ed 
int [unsigned] [usertype] key @@
   net/ipv4/route.c:782:46:    expected unsigned int [unsigned] [usertype] key
   net/ipv4/route.c:782:46:    got restricted __be32 [usertype] new_gw
>> net/ipv4/route.c:2695:29: sparse: incorrect type in initializer (different 
>> base types) @@    expected int [signed] p @@    got restint [signed] p @@
   net/ipv4/route.c:2695:29:    expected int [signed] p
   net/ipv4/route.c:2695:29:    got restricted __be16
>> net/ipv4/route.c:2700:15: sparse: incorrect type in assignment (different 
>> base types) @@    expected restricted __be16 [usertype] <noident> @@    got 
>> 6 [usertype] <noident> @@
   net/ipv4/route.c:2700:15:    expected restricted __be16 [usertype] <noident>
   net/ipv4/route.c:2700:15:    got int [signed] p
>> net/ipv4/route.c:2816:27: sparse: incorrect type in assignment (different 
>> base types) @@    expected restricted __be16 [usertype] len @@    got 6 
>> [usertype] len @@
   net/ipv4/route.c:2816:27:    expected restricted __be16 [usertype] len
   net/ipv4/route.c:2816:27:    got unsigned long

vim +2695 net/ipv4/route.c

  2692  
  2693  static int nla_get_port(struct nlattr *attr, __be16 *port)
  2694  {
> 2695          int p = nla_get_be16(attr);
  2696  
  2697          if (p <= 0 || p >= 0xffff)
  2698                  return -EINVAL;
  2699  
> 2700          *port = p;
  2701          return 0;
  2702  }
  2703  
  2704  static int inet_rtm_getroute_reply(struct sk_buff *in_skb, struct 
nlmsghdr *nlh,
  2705                                     __be32 dst, __be32 src, struct 
flowi4 *fl4,
  2706                                     struct rtable *rt, struct fib_result 
*res)
  2707  {
  2708          struct net *net = sock_net(in_skb->sk);
  2709          struct rtmsg *rtm = nlmsg_data(nlh);
  2710          u32 table_id = RT_TABLE_MAIN;
  2711          struct sk_buff *skb;
  2712          int err = 0;
  2713  
  2714          skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  2715          if (!skb) {
  2716                  err = -ENOMEM;
  2717                  return err;
  2718          }
  2719  
  2720          if (rtm->rtm_flags & RTM_F_LOOKUP_TABLE)
  2721                  table_id = res->table ? res->table->tb_id : 0;
  2722  
  2723          if (rtm->rtm_flags & RTM_F_FIB_MATCH)
  2724                  err = fib_dump_info(skb, NETLINK_CB(in_skb).portid,
  2725                                      nlh->nlmsg_seq, RTM_NEWROUTE, 
table_id,
  2726                                      rt->rt_type, res->prefix, 
res->prefixlen,
  2727                                      fl4->flowi4_tos, res->fi, 0);
  2728          else
  2729                  err = rt_fill_info(net, dst, src, rt, table_id,
  2730                                     fl4, skb, NETLINK_CB(in_skb).portid,
  2731                                     nlh->nlmsg_seq);
  2732          if (err < 0)
  2733                  goto errout;
  2734  
  2735          return rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
  2736  
  2737  errout:
  2738          kfree_skb(skb);
  2739          return err;
  2740  }
  2741  
  2742  static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr 
*nlh,
  2743                               struct netlink_ext_ack *extack)
  2744  {
  2745          struct net *net = sock_net(in_skb->sk);
  2746          struct nlattr *tb[RTA_MAX+1];
  2747          __be16 sport = 0, dport = 0;
  2748          struct fib_result res = {};
  2749          struct rtable *rt = NULL;
  2750          struct sk_buff *skb;
  2751          struct rtmsg *rtm;
  2752          struct flowi4 fl4;
  2753          struct iphdr *iph;
  2754          struct udphdr *udph;
  2755          __be32 dst = 0;
  2756          __be32 src = 0;
  2757          kuid_t uid;
  2758          u32 iif;
  2759          int err;
  2760          int mark;
  2761  
  2762          err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, 
rtm_ipv4_policy,
  2763                            extack);
  2764          if (err < 0)
  2765                  return err;
  2766  
  2767          rtm = nlmsg_data(nlh);
  2768  
  2769          skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
  2770          if (!skb) {
  2771                  err = -ENOBUFS;
  2772                  return err;
  2773          }
  2774  
  2775          /* Reserve room for dummy headers, this skb can pass
  2776             through good chunk of routing engine.
  2777           */
  2778          skb_reset_mac_header(skb);
  2779          skb_reset_network_header(skb);
  2780  
  2781          src = tb[RTA_SRC] ? nla_get_in_addr(tb[RTA_SRC]) : 0;
  2782          dst = tb[RTA_DST] ? nla_get_in_addr(tb[RTA_DST]) : 0;
  2783          iif = tb[RTA_IIF] ? nla_get_u32(tb[RTA_IIF]) : 0;
  2784          mark = tb[RTA_MARK] ? nla_get_u32(tb[RTA_MARK]) : 0;
  2785          if (tb[RTA_UID])
  2786                  uid = make_kuid(current_user_ns(), 
nla_get_u32(tb[RTA_UID]));
  2787          else
  2788                  uid = (iif ? INVALID_UID : current_uid());
  2789          if (tb[RTA_SPORT]) {
  2790                  err = nla_get_port(tb[RTA_SPORT], &sport);
  2791                  if (err)
  2792                          goto errout_free;
  2793          }
  2794  
  2795          if (tb[RTA_DPORT]) {
  2796                  err = nla_get_port(tb[RTA_DPORT], &dport);
  2797                  if (err)
  2798                          goto errout_free;
  2799          }
  2800  
  2801          skb->protocol = htons(ETH_P_IP);
  2802          iph = skb_put(skb, sizeof(struct iphdr));
  2803          iph->protocol = IPPROTO_UDP;
  2804          iph->saddr = src;
  2805          iph->daddr = dst;
  2806          iph->version = 0x4;
  2807          iph->frag_off = 0;
  2808  
  2809          if (sport || dport) {
  2810                  iph->ihl = 0x5;
  2811                  skb_set_transport_header(skb, skb->len);
  2812  
  2813                  udph = skb_put(skb, sizeof(struct udphdr));
  2814                  udph->dest = dport;
  2815                  udph->source = sport;
> 2816                  udph->len = sizeof(struct udphdr);
  2817                  udph->check = 0;
  2818          }
  2819  
  2820          memset(&fl4, 0, sizeof(fl4));
  2821          fl4.daddr = dst;
  2822          fl4.saddr = src;
  2823          fl4.flowi4_tos = rtm->rtm_tos;
  2824          fl4.flowi4_oif = tb[RTA_OIF] ? nla_get_u32(tb[RTA_OIF]) : 0;
  2825          fl4.flowi4_mark = mark;
  2826          fl4.flowi4_uid = uid;
  2827          if (sport)
  2828                  fl4.fl4_sport = sport;
  2829          if (dport)
  2830                  fl4.fl4_dport = dport;
  2831          fl4.flowi4_proto = IPPROTO_UDP;
  2832  
  2833          rcu_read_lock();
  2834  
  2835          if (iif) {
  2836                  struct net_device *dev;
  2837  
  2838                  dev = dev_get_by_index_rcu(net, iif);
  2839                  if (!dev) {
  2840                          err = -ENODEV;
  2841                          goto errout_rcu;
  2842                  }
  2843  
  2844                  fl4.flowi4_iif = iif; /* for rt_fill_info */
  2845                  skb->protocol   = htons(ETH_P_IP);
  2846                  skb->dev        = dev;
  2847                  skb->mark       = mark;
  2848                  err = ip_route_input_rcu(skb, dst, src, rtm->rtm_tos,
  2849                                           dev, &res);
  2850  
  2851                  rt = skb_rtable(skb);
  2852                  if (err == 0 && rt->dst.error)
  2853                          err = -rt->dst.error;
  2854          } else {
  2855                  fl4.flowi4_iif = LOOPBACK_IFINDEX;
  2856                  rt = ip_route_output_key_hash_rcu(net, &fl4, &res, skb);
  2857                  err = 0;
  2858                  if (IS_ERR(rt))
  2859                          err = PTR_ERR(rt);
  2860                  else
  2861                          skb_dst_set(skb, &rt->dst);
  2862          }
  2863  
  2864          if (err)
  2865                  goto errout_rcu;
  2866  
  2867          if (rtm->rtm_flags & RTM_F_NOTIFY)
  2868                  rt->rt_flags |= RTCF_NOTIFY;
  2869  
  2870          if (rtm->rtm_flags & RTM_F_FIB_MATCH) {
  2871                  if (!res.fi) {
  2872                          err = fib_props[res.type].error;
  2873                          if (!err)
  2874                                  err = -EHOSTUNREACH;
  2875                          goto errout_rcu;
  2876                  }
  2877          }
  2878  
  2879          err = inet_rtm_getroute_reply(in_skb, nlh, dst, src, &fl4, rt, 
&res);
  2880          if (err < 0)
  2881                  goto errout_rcu;
  2882  
  2883          rcu_read_unlock();
  2884  
  2885  errout_free:
  2886          kfree_skb(skb);
  2887          return err;
  2888  errout_rcu:
  2889          rcu_read_unlock();
  2890          goto errout_free;
  2891  }
  2892  

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

Reply via email to