ipvs: fix sparse warnings for some parameters
authorJulian Anastasov <ja@ssi.bg>
Wed, 17 Apr 2013 20:50:49 +0000 (23:50 +0300)
committerSimon Horman <horms@verge.net.au>
Tue, 23 Apr 2013 02:43:05 +0000 (11:43 +0900)
Some service fields are in network order:

- netmask: used once in network order and also as prefix len for IPv6
- port

Other parameters are in host order:

- struct ip_vs_flags: flags and mask moved between user and kernel only
- sync state: moved between user and kernel only
- syncid: sent over network as single octet

Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
include/net/ip_vs.h
include/uapi/linux/ip_vs.h
net/netfilter/ipvs/ip_vs_core.c
net/netfilter/ipvs/ip_vs_ctl.c

index f9f5b05..4c062cc 100644 (file)
@@ -678,7 +678,7 @@ struct ip_vs_service_user_kern {
        u16                     af;
        u16                     protocol;
        union nf_inet_addr      addr;           /* virtual ip address */
-       u16                     port;
+       __be16                  port;
        u32                     fwmark;         /* firwall mark of service */
 
        /* virtual service options */
@@ -686,14 +686,14 @@ struct ip_vs_service_user_kern {
        char                    *pe_name;
        unsigned int            flags;          /* virtual service flags */
        unsigned int            timeout;        /* persistent timeout in sec */
-       u32                     netmask;        /* persistent netmask */
+       __be32                  netmask;        /* persistent netmask or plen */
 };
 
 
 struct ip_vs_dest_user_kern {
        /* destination server address */
        union nf_inet_addr      addr;
-       u16                     port;
+       __be16                  port;
 
        /* real server options */
        unsigned int            conn_flags;     /* connection flags */
@@ -721,7 +721,7 @@ struct ip_vs_service {
        __u32                   fwmark;   /* firewall mark of the service */
        unsigned int            flags;    /* service status flags */
        unsigned int            timeout;  /* persistent timeout in ticks */
-       __be32                  netmask;  /* grouping granularity */
+       __be32                  netmask;  /* grouping granularity, mask/plen */
        struct net              *net;
 
        struct list_head        destinations;  /* real server d-linked list */
index 8a2d438..a245377 100644 (file)
@@ -280,8 +280,8 @@ struct ip_vs_daemon_user {
 #define IPVS_GENL_VERSION      0x1
 
 struct ip_vs_flags {
-       __be32 flags;
-       __be32 mask;
+       __u32 flags;
+       __u32 mask;
 };
 
 /* Generic Netlink command attributes */
index f26fe33..a0d7bd3 100644 (file)
@@ -235,7 +235,8 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
        /* Mask saddr with the netmask to adjust template granularity */
 #ifdef CONFIG_IP_VS_IPV6
        if (svc->af == AF_INET6)
-               ipv6_addr_prefix(&snet.in6, &iph->saddr.in6, svc->netmask);
+               ipv6_addr_prefix(&snet.in6, &iph->saddr.in6,
+                                (__force __u32) svc->netmask);
        else
 #endif
                snet.ip = iph->saddr.ip & svc->netmask;
index 64075a7..5b142fb 100644 (file)
@@ -1164,9 +1164,13 @@ ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u,
        }
 
 #ifdef CONFIG_IP_VS_IPV6
-       if (u->af == AF_INET6 && (u->netmask < 1 || u->netmask > 128)) {
-               ret = -EINVAL;
-               goto out_err;
+       if (u->af == AF_INET6) {
+               __u32 plen = (__force __u32) u->netmask;
+
+               if (plen < 1 || plen > 128) {
+                       ret = -EINVAL;
+                       goto out_err;
+               }
        }
 #endif
 
@@ -1277,9 +1281,13 @@ ip_vs_edit_service(struct ip_vs_service *svc, struct ip_vs_service_user_kern *u)
        }
 
 #ifdef CONFIG_IP_VS_IPV6
-       if (u->af == AF_INET6 && (u->netmask < 1 || u->netmask > 128)) {
-               ret = -EINVAL;
-               goto out;
+       if (u->af == AF_INET6) {
+               __u32 plen = (__force __u32) u->netmask;
+
+               if (plen < 1 || plen > 128) {
+                       ret = -EINVAL;
+                       goto out;
+               }
        }
 #endif
 
@@ -2892,7 +2900,7 @@ static int ip_vs_genl_fill_service(struct sk_buff *skb,
        } else {
                if (nla_put_u16(skb, IPVS_SVC_ATTR_PROTOCOL, svc->protocol) ||
                    nla_put(skb, IPVS_SVC_ATTR_ADDR, sizeof(svc->addr), &svc->addr) ||
-                   nla_put_u16(skb, IPVS_SVC_ATTR_PORT, svc->port))
+                   nla_put_be16(skb, IPVS_SVC_ATTR_PORT, svc->port))
                        goto nla_put_failure;
        }
 
@@ -2902,7 +2910,7 @@ static int ip_vs_genl_fill_service(struct sk_buff *skb,
            (pe && nla_put_string(skb, IPVS_SVC_ATTR_PE_NAME, pe->name)) ||
            nla_put(skb, IPVS_SVC_ATTR_FLAGS, sizeof(flags), &flags) ||
            nla_put_u32(skb, IPVS_SVC_ATTR_TIMEOUT, svc->timeout / HZ) ||
-           nla_put_u32(skb, IPVS_SVC_ATTR_NETMASK, svc->netmask))
+           nla_put_be32(skb, IPVS_SVC_ATTR_NETMASK, svc->netmask))
                goto nla_put_failure;
        if (ip_vs_genl_fill_stats(skb, IPVS_SVC_ATTR_STATS, &svc->stats))
                goto nla_put_failure;
@@ -3015,7 +3023,7 @@ static int ip_vs_genl_parse_service(struct net *net,
        } else {
                usvc->protocol = nla_get_u16(nla_protocol);
                nla_memcpy(&usvc->addr, nla_addr, sizeof(usvc->addr));
-               usvc->port = nla_get_u16(nla_port);
+               usvc->port = nla_get_be16(nla_port);
                usvc->fwmark = 0;
        }
 
@@ -3055,7 +3063,7 @@ static int ip_vs_genl_parse_service(struct net *net,
                usvc->sched_name = nla_data(nla_sched);
                usvc->pe_name = nla_pe ? nla_data(nla_pe) : NULL;
                usvc->timeout = nla_get_u32(nla_timeout);
-               usvc->netmask = nla_get_u32(nla_netmask);
+               usvc->netmask = nla_get_be32(nla_netmask);
        }
 
        return 0;
@@ -3081,7 +3089,7 @@ static int ip_vs_genl_fill_dest(struct sk_buff *skb, struct ip_vs_dest *dest)
                return -EMSGSIZE;
 
        if (nla_put(skb, IPVS_DEST_ATTR_ADDR, sizeof(dest->addr), &dest->addr) ||
-           nla_put_u16(skb, IPVS_DEST_ATTR_PORT, dest->port) ||
+           nla_put_be16(skb, IPVS_DEST_ATTR_PORT, dest->port) ||
            nla_put_u32(skb, IPVS_DEST_ATTR_FWD_METHOD,
                        (atomic_read(&dest->conn_flags) &
                         IP_VS_CONN_F_FWD_MASK)) ||
@@ -3190,7 +3198,7 @@ static int ip_vs_genl_parse_dest(struct ip_vs_dest_user_kern *udest,
        memset(udest, 0, sizeof(*udest));
 
        nla_memcpy(&udest->addr, nla_addr, sizeof(udest->addr));
-       udest->port = nla_get_u16(nla_port);
+       udest->port = nla_get_be16(nla_port);
 
        /* If a full entry was requested, check for the additional fields */
        if (full_entry) {
@@ -3215,8 +3223,8 @@ static int ip_vs_genl_parse_dest(struct ip_vs_dest_user_kern *udest,
        return 0;
 }
 
-static int ip_vs_genl_fill_daemon(struct sk_buff *skb, __be32 state,
-                                 const char *mcast_ifn, __be32 syncid)
+static int ip_vs_genl_fill_daemon(struct sk_buff *skb, __u32 state,
+                                 const char *mcast_ifn, __u32 syncid)
 {
        struct nlattr *nl_daemon;
 
@@ -3237,8 +3245,8 @@ nla_put_failure:
        return -EMSGSIZE;
 }
 
-static int ip_vs_genl_dump_daemon(struct sk_buff *skb, __be32 state,
-                                 const char *mcast_ifn, __be32 syncid,
+static int ip_vs_genl_dump_daemon(struct sk_buff *skb, __u32 state,
+                                 const char *mcast_ifn, __u32 syncid,
                                  struct netlink_callback *cb)
 {
        void *hdr;