mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-29 07:04:10 +08:00
Merge branch 'ip_tunnel-netlink-parms'
Liu Jian says: ==================== Add helper functions to parse netlink msg of ip_tunnel v1->v2: Move the implementation of the helper function to ip_tunnel_core.c v2->v3: Change EXPORT_SYMBOL to EXPORT_SYMBOL_GPL ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
3735264d72
@ -302,6 +302,12 @@ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
|
||||
struct ip_tunnel_parm *p, __u32 fwmark);
|
||||
void ip_tunnel_setup(struct net_device *dev, unsigned int net_id);
|
||||
|
||||
bool ip_tunnel_netlink_encap_parms(struct nlattr *data[],
|
||||
struct ip_tunnel_encap *encap);
|
||||
|
||||
void ip_tunnel_netlink_parms(struct nlattr *data[],
|
||||
struct ip_tunnel_parm *parms);
|
||||
|
||||
extern const struct header_ops ip_tunnel_header_ops;
|
||||
__be16 ip_tunnel_parse_protocol(const struct sk_buff *skb);
|
||||
|
||||
|
@ -1079,3 +1079,70 @@ EXPORT_SYMBOL(ip_tunnel_parse_protocol);
|
||||
|
||||
const struct header_ops ip_tunnel_header_ops = { .parse_protocol = ip_tunnel_parse_protocol };
|
||||
EXPORT_SYMBOL(ip_tunnel_header_ops);
|
||||
|
||||
/* This function returns true when ENCAP attributes are present in the nl msg */
|
||||
bool ip_tunnel_netlink_encap_parms(struct nlattr *data[],
|
||||
struct ip_tunnel_encap *encap)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
memset(encap, 0, sizeof(*encap));
|
||||
|
||||
if (!data)
|
||||
return ret;
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_TYPE]) {
|
||||
ret = true;
|
||||
encap->type = nla_get_u16(data[IFLA_IPTUN_ENCAP_TYPE]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_FLAGS]) {
|
||||
ret = true;
|
||||
encap->flags = nla_get_u16(data[IFLA_IPTUN_ENCAP_FLAGS]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_SPORT]) {
|
||||
ret = true;
|
||||
encap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_DPORT]) {
|
||||
ret = true;
|
||||
encap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip_tunnel_netlink_encap_parms);
|
||||
|
||||
void ip_tunnel_netlink_parms(struct nlattr *data[],
|
||||
struct ip_tunnel_parm *parms)
|
||||
{
|
||||
if (data[IFLA_IPTUN_LINK])
|
||||
parms->link = nla_get_u32(data[IFLA_IPTUN_LINK]);
|
||||
|
||||
if (data[IFLA_IPTUN_LOCAL])
|
||||
parms->iph.saddr = nla_get_be32(data[IFLA_IPTUN_LOCAL]);
|
||||
|
||||
if (data[IFLA_IPTUN_REMOTE])
|
||||
parms->iph.daddr = nla_get_be32(data[IFLA_IPTUN_REMOTE]);
|
||||
|
||||
if (data[IFLA_IPTUN_TTL]) {
|
||||
parms->iph.ttl = nla_get_u8(data[IFLA_IPTUN_TTL]);
|
||||
if (parms->iph.ttl)
|
||||
parms->iph.frag_off = htons(IP_DF);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_TOS])
|
||||
parms->iph.tos = nla_get_u8(data[IFLA_IPTUN_TOS]);
|
||||
|
||||
if (!data[IFLA_IPTUN_PMTUDISC] || nla_get_u8(data[IFLA_IPTUN_PMTUDISC]))
|
||||
parms->iph.frag_off = htons(IP_DF);
|
||||
|
||||
if (data[IFLA_IPTUN_FLAGS])
|
||||
parms->i_flags = nla_get_be16(data[IFLA_IPTUN_FLAGS]);
|
||||
|
||||
if (data[IFLA_IPTUN_PROTO])
|
||||
parms->iph.protocol = nla_get_u8(data[IFLA_IPTUN_PROTO]);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip_tunnel_netlink_parms);
|
||||
|
@ -417,29 +417,7 @@ static void ipip_netlink_parms(struct nlattr *data[],
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
if (data[IFLA_IPTUN_LINK])
|
||||
parms->link = nla_get_u32(data[IFLA_IPTUN_LINK]);
|
||||
|
||||
if (data[IFLA_IPTUN_LOCAL])
|
||||
parms->iph.saddr = nla_get_in_addr(data[IFLA_IPTUN_LOCAL]);
|
||||
|
||||
if (data[IFLA_IPTUN_REMOTE])
|
||||
parms->iph.daddr = nla_get_in_addr(data[IFLA_IPTUN_REMOTE]);
|
||||
|
||||
if (data[IFLA_IPTUN_TTL]) {
|
||||
parms->iph.ttl = nla_get_u8(data[IFLA_IPTUN_TTL]);
|
||||
if (parms->iph.ttl)
|
||||
parms->iph.frag_off = htons(IP_DF);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_TOS])
|
||||
parms->iph.tos = nla_get_u8(data[IFLA_IPTUN_TOS]);
|
||||
|
||||
if (data[IFLA_IPTUN_PROTO])
|
||||
parms->iph.protocol = nla_get_u8(data[IFLA_IPTUN_PROTO]);
|
||||
|
||||
if (!data[IFLA_IPTUN_PMTUDISC] || nla_get_u8(data[IFLA_IPTUN_PMTUDISC]))
|
||||
parms->iph.frag_off = htons(IP_DF);
|
||||
ip_tunnel_netlink_parms(data, parms);
|
||||
|
||||
if (data[IFLA_IPTUN_COLLECT_METADATA])
|
||||
*collect_md = true;
|
||||
@ -448,40 +426,6 @@ static void ipip_netlink_parms(struct nlattr *data[],
|
||||
*fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);
|
||||
}
|
||||
|
||||
/* This function returns true when ENCAP attributes are present in the nl msg */
|
||||
static bool ipip_netlink_encap_parms(struct nlattr *data[],
|
||||
struct ip_tunnel_encap *ipencap)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
memset(ipencap, 0, sizeof(*ipencap));
|
||||
|
||||
if (!data)
|
||||
return ret;
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_TYPE]) {
|
||||
ret = true;
|
||||
ipencap->type = nla_get_u16(data[IFLA_IPTUN_ENCAP_TYPE]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_FLAGS]) {
|
||||
ret = true;
|
||||
ipencap->flags = nla_get_u16(data[IFLA_IPTUN_ENCAP_FLAGS]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_SPORT]) {
|
||||
ret = true;
|
||||
ipencap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_DPORT]) {
|
||||
ret = true;
|
||||
ipencap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ipip_newlink(struct net *src_net, struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
@ -491,7 +435,7 @@ static int ipip_newlink(struct net *src_net, struct net_device *dev,
|
||||
struct ip_tunnel_encap ipencap;
|
||||
__u32 fwmark = 0;
|
||||
|
||||
if (ipip_netlink_encap_parms(data, &ipencap)) {
|
||||
if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
|
||||
int err = ip_tunnel_encap_setup(t, &ipencap);
|
||||
|
||||
if (err < 0)
|
||||
@ -512,7 +456,7 @@ static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
bool collect_md;
|
||||
__u32 fwmark = t->fwmark;
|
||||
|
||||
if (ipip_netlink_encap_parms(data, &ipencap)) {
|
||||
if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
|
||||
int err = ip_tunnel_encap_setup(t, &ipencap);
|
||||
|
||||
if (err < 0)
|
||||
|
@ -1988,39 +1988,6 @@ static void ip6_tnl_netlink_parms(struct nlattr *data[],
|
||||
parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);
|
||||
}
|
||||
|
||||
static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],
|
||||
struct ip_tunnel_encap *ipencap)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
memset(ipencap, 0, sizeof(*ipencap));
|
||||
|
||||
if (!data)
|
||||
return ret;
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_TYPE]) {
|
||||
ret = true;
|
||||
ipencap->type = nla_get_u16(data[IFLA_IPTUN_ENCAP_TYPE]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_FLAGS]) {
|
||||
ret = true;
|
||||
ipencap->flags = nla_get_u16(data[IFLA_IPTUN_ENCAP_FLAGS]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_SPORT]) {
|
||||
ret = true;
|
||||
ipencap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_DPORT]) {
|
||||
ret = true;
|
||||
ipencap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
@ -2033,7 +2000,7 @@ static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev,
|
||||
|
||||
nt = netdev_priv(dev);
|
||||
|
||||
if (ip6_tnl_netlink_encap_parms(data, &ipencap)) {
|
||||
if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
|
||||
err = ip6_tnl_encap_setup(nt, &ipencap);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -2070,7 +2037,7 @@ static int ip6_tnl_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
if (dev == ip6n->fb_tnl_dev)
|
||||
return -EINVAL;
|
||||
|
||||
if (ip6_tnl_netlink_encap_parms(data, &ipencap)) {
|
||||
if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
|
||||
int err = ip6_tnl_encap_setup(t, &ipencap);
|
||||
|
||||
if (err < 0)
|
||||
|
@ -1503,71 +1503,12 @@ static void ipip6_netlink_parms(struct nlattr *data[],
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
if (data[IFLA_IPTUN_LINK])
|
||||
parms->link = nla_get_u32(data[IFLA_IPTUN_LINK]);
|
||||
|
||||
if (data[IFLA_IPTUN_LOCAL])
|
||||
parms->iph.saddr = nla_get_be32(data[IFLA_IPTUN_LOCAL]);
|
||||
|
||||
if (data[IFLA_IPTUN_REMOTE])
|
||||
parms->iph.daddr = nla_get_be32(data[IFLA_IPTUN_REMOTE]);
|
||||
|
||||
if (data[IFLA_IPTUN_TTL]) {
|
||||
parms->iph.ttl = nla_get_u8(data[IFLA_IPTUN_TTL]);
|
||||
if (parms->iph.ttl)
|
||||
parms->iph.frag_off = htons(IP_DF);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_TOS])
|
||||
parms->iph.tos = nla_get_u8(data[IFLA_IPTUN_TOS]);
|
||||
|
||||
if (!data[IFLA_IPTUN_PMTUDISC] || nla_get_u8(data[IFLA_IPTUN_PMTUDISC]))
|
||||
parms->iph.frag_off = htons(IP_DF);
|
||||
|
||||
if (data[IFLA_IPTUN_FLAGS])
|
||||
parms->i_flags = nla_get_be16(data[IFLA_IPTUN_FLAGS]);
|
||||
|
||||
if (data[IFLA_IPTUN_PROTO])
|
||||
parms->iph.protocol = nla_get_u8(data[IFLA_IPTUN_PROTO]);
|
||||
ip_tunnel_netlink_parms(data, parms);
|
||||
|
||||
if (data[IFLA_IPTUN_FWMARK])
|
||||
*fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);
|
||||
}
|
||||
|
||||
/* This function returns true when ENCAP attributes are present in the nl msg */
|
||||
static bool ipip6_netlink_encap_parms(struct nlattr *data[],
|
||||
struct ip_tunnel_encap *ipencap)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
memset(ipencap, 0, sizeof(*ipencap));
|
||||
|
||||
if (!data)
|
||||
return ret;
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_TYPE]) {
|
||||
ret = true;
|
||||
ipencap->type = nla_get_u16(data[IFLA_IPTUN_ENCAP_TYPE]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_FLAGS]) {
|
||||
ret = true;
|
||||
ipencap->flags = nla_get_u16(data[IFLA_IPTUN_ENCAP_FLAGS]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_SPORT]) {
|
||||
ret = true;
|
||||
ipencap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]);
|
||||
}
|
||||
|
||||
if (data[IFLA_IPTUN_ENCAP_DPORT]) {
|
||||
ret = true;
|
||||
ipencap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IPV6_SIT_6RD
|
||||
/* This function returns true when 6RD attributes are present in the nl msg */
|
||||
static bool ipip6_netlink_6rd_parms(struct nlattr *data[],
|
||||
@ -1619,7 +1560,7 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev,
|
||||
|
||||
nt = netdev_priv(dev);
|
||||
|
||||
if (ipip6_netlink_encap_parms(data, &ipencap)) {
|
||||
if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
|
||||
err = ip_tunnel_encap_setup(nt, &ipencap);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -1671,7 +1612,7 @@ static int ipip6_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
if (dev == sitn->fb_tunnel_dev)
|
||||
return -EINVAL;
|
||||
|
||||
if (ipip6_netlink_encap_parms(data, &ipencap)) {
|
||||
if (ip_tunnel_netlink_encap_parms(data, &ipencap)) {
|
||||
err = ip_tunnel_encap_setup(t, &ipencap);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
Loading…
Reference in New Issue
Block a user