ipvs: fix sparse warnings for some parameters

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>
This commit is contained in:
Julian Anastasov 2013-04-17 23:50:49 +03:00 committed by Simon Horman
parent f33c8b94fd
commit 0a925864c1
4 changed files with 32 additions and 23 deletions

View File

@ -678,7 +678,7 @@ struct ip_vs_service_user_kern {
u16 af; u16 af;
u16 protocol; u16 protocol;
union nf_inet_addr addr; /* virtual ip address */ union nf_inet_addr addr; /* virtual ip address */
u16 port; __be16 port;
u32 fwmark; /* firwall mark of service */ u32 fwmark; /* firwall mark of service */
/* virtual service options */ /* virtual service options */
@ -686,14 +686,14 @@ struct ip_vs_service_user_kern {
char *pe_name; char *pe_name;
unsigned int flags; /* virtual service flags */ unsigned int flags; /* virtual service flags */
unsigned int timeout; /* persistent timeout in sec */ unsigned int timeout; /* persistent timeout in sec */
u32 netmask; /* persistent netmask */ __be32 netmask; /* persistent netmask or plen */
}; };
struct ip_vs_dest_user_kern { struct ip_vs_dest_user_kern {
/* destination server address */ /* destination server address */
union nf_inet_addr addr; union nf_inet_addr addr;
u16 port; __be16 port;
/* real server options */ /* real server options */
unsigned int conn_flags; /* connection flags */ unsigned int conn_flags; /* connection flags */
@ -721,7 +721,7 @@ struct ip_vs_service {
__u32 fwmark; /* firewall mark of the service */ __u32 fwmark; /* firewall mark of the service */
unsigned int flags; /* service status flags */ unsigned int flags; /* service status flags */
unsigned int timeout; /* persistent timeout in ticks */ unsigned int timeout; /* persistent timeout in ticks */
__be32 netmask; /* grouping granularity */ __be32 netmask; /* grouping granularity, mask/plen */
struct net *net; struct net *net;
struct list_head destinations; /* real server d-linked list */ struct list_head destinations; /* real server d-linked list */

View File

@ -280,8 +280,8 @@ struct ip_vs_daemon_user {
#define IPVS_GENL_VERSION 0x1 #define IPVS_GENL_VERSION 0x1
struct ip_vs_flags { struct ip_vs_flags {
__be32 flags; __u32 flags;
__be32 mask; __u32 mask;
}; };
/* Generic Netlink command attributes */ /* Generic Netlink command attributes */

View File

@ -235,7 +235,8 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
/* Mask saddr with the netmask to adjust template granularity */ /* Mask saddr with the netmask to adjust template granularity */
#ifdef CONFIG_IP_VS_IPV6 #ifdef CONFIG_IP_VS_IPV6
if (svc->af == AF_INET6) 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 else
#endif #endif
snet.ip = iph->saddr.ip & svc->netmask; snet.ip = iph->saddr.ip & svc->netmask;

View File

@ -1164,9 +1164,13 @@ ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u,
} }
#ifdef CONFIG_IP_VS_IPV6 #ifdef CONFIG_IP_VS_IPV6
if (u->af == AF_INET6 && (u->netmask < 1 || u->netmask > 128)) { if (u->af == AF_INET6) {
ret = -EINVAL; __u32 plen = (__force __u32) u->netmask;
goto out_err;
if (plen < 1 || plen > 128) {
ret = -EINVAL;
goto out_err;
}
} }
#endif #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 #ifdef CONFIG_IP_VS_IPV6
if (u->af == AF_INET6 && (u->netmask < 1 || u->netmask > 128)) { if (u->af == AF_INET6) {
ret = -EINVAL; __u32 plen = (__force __u32) u->netmask;
goto out;
if (plen < 1 || plen > 128) {
ret = -EINVAL;
goto out;
}
} }
#endif #endif
@ -2892,7 +2900,7 @@ static int ip_vs_genl_fill_service(struct sk_buff *skb,
} else { } else {
if (nla_put_u16(skb, IPVS_SVC_ATTR_PROTOCOL, svc->protocol) || 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(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; 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)) || (pe && nla_put_string(skb, IPVS_SVC_ATTR_PE_NAME, pe->name)) ||
nla_put(skb, IPVS_SVC_ATTR_FLAGS, sizeof(flags), &flags) || 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_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; goto nla_put_failure;
if (ip_vs_genl_fill_stats(skb, IPVS_SVC_ATTR_STATS, &svc->stats)) if (ip_vs_genl_fill_stats(skb, IPVS_SVC_ATTR_STATS, &svc->stats))
goto nla_put_failure; goto nla_put_failure;
@ -3015,7 +3023,7 @@ static int ip_vs_genl_parse_service(struct net *net,
} else { } else {
usvc->protocol = nla_get_u16(nla_protocol); usvc->protocol = nla_get_u16(nla_protocol);
nla_memcpy(&usvc->addr, nla_addr, sizeof(usvc->addr)); 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; 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->sched_name = nla_data(nla_sched);
usvc->pe_name = nla_pe ? nla_data(nla_pe) : NULL; usvc->pe_name = nla_pe ? nla_data(nla_pe) : NULL;
usvc->timeout = nla_get_u32(nla_timeout); usvc->timeout = nla_get_u32(nla_timeout);
usvc->netmask = nla_get_u32(nla_netmask); usvc->netmask = nla_get_be32(nla_netmask);
} }
return 0; return 0;
@ -3081,7 +3089,7 @@ static int ip_vs_genl_fill_dest(struct sk_buff *skb, struct ip_vs_dest *dest)
return -EMSGSIZE; return -EMSGSIZE;
if (nla_put(skb, IPVS_DEST_ATTR_ADDR, sizeof(dest->addr), &dest->addr) || 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, nla_put_u32(skb, IPVS_DEST_ATTR_FWD_METHOD,
(atomic_read(&dest->conn_flags) & (atomic_read(&dest->conn_flags) &
IP_VS_CONN_F_FWD_MASK)) || 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)); memset(udest, 0, sizeof(*udest));
nla_memcpy(&udest->addr, nla_addr, sizeof(udest->addr)); 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 a full entry was requested, check for the additional fields */
if (full_entry) { if (full_entry) {
@ -3215,8 +3223,8 @@ static int ip_vs_genl_parse_dest(struct ip_vs_dest_user_kern *udest,
return 0; return 0;
} }
static int ip_vs_genl_fill_daemon(struct sk_buff *skb, __be32 state, static int ip_vs_genl_fill_daemon(struct sk_buff *skb, __u32 state,
const char *mcast_ifn, __be32 syncid) const char *mcast_ifn, __u32 syncid)
{ {
struct nlattr *nl_daemon; struct nlattr *nl_daemon;
@ -3237,8 +3245,8 @@ nla_put_failure:
return -EMSGSIZE; return -EMSGSIZE;
} }
static int ip_vs_genl_dump_daemon(struct sk_buff *skb, __be32 state, static int ip_vs_genl_dump_daemon(struct sk_buff *skb, __u32 state,
const char *mcast_ifn, __be32 syncid, const char *mcast_ifn, __u32 syncid,
struct netlink_callback *cb) struct netlink_callback *cb)
{ {
void *hdr; void *hdr;