net: ip6_gre: Split up ip6gre_tnl_link_config()
The function ip6gre_tnl_link_config() is used for setting up
configuration of both ip6gretap and ip6erspan tunnels. Split the
function into the common part and the route-lookup part. The latter then
takes the calculated header length as an argument. This split will allow
the patches down the line to sneak in a custom header length computation
for the ERSPAN tunnel.
Fixes: 5a963eb61b
("ip6_gre: Add ERSPAN native tunnel support")
Signed-off-by: Petr Machata <petrm@mellanox.com>
Acked-by: William Tu <u9012063@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5691484df9
commit
a483373ead
|
@ -1025,12 +1025,11 @@ tx_err:
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
|
static void ip6gre_tnl_link_config_common(struct ip6_tnl *t)
|
||||||
{
|
{
|
||||||
struct net_device *dev = t->dev;
|
struct net_device *dev = t->dev;
|
||||||
struct __ip6_tnl_parm *p = &t->parms;
|
struct __ip6_tnl_parm *p = &t->parms;
|
||||||
struct flowi6 *fl6 = &t->fl.u.ip6;
|
struct flowi6 *fl6 = &t->fl.u.ip6;
|
||||||
int t_hlen;
|
|
||||||
|
|
||||||
if (dev->type != ARPHRD_ETHER) {
|
if (dev->type != ARPHRD_ETHER) {
|
||||||
memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr));
|
memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr));
|
||||||
|
@ -1057,12 +1056,13 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
|
||||||
dev->flags |= IFF_POINTOPOINT;
|
dev->flags |= IFF_POINTOPOINT;
|
||||||
else
|
else
|
||||||
dev->flags &= ~IFF_POINTOPOINT;
|
dev->flags &= ~IFF_POINTOPOINT;
|
||||||
|
}
|
||||||
|
|
||||||
t->tun_hlen = gre_calc_hlen(t->parms.o_flags);
|
static void ip6gre_tnl_link_config_route(struct ip6_tnl *t, int set_mtu,
|
||||||
|
int t_hlen)
|
||||||
t->hlen = t->encap_hlen + t->tun_hlen;
|
{
|
||||||
|
const struct __ip6_tnl_parm *p = &t->parms;
|
||||||
t_hlen = t->hlen + sizeof(struct ipv6hdr);
|
struct net_device *dev = t->dev;
|
||||||
|
|
||||||
if (p->flags & IP6_TNL_F_CAP_XMIT) {
|
if (p->flags & IP6_TNL_F_CAP_XMIT) {
|
||||||
int strict = (ipv6_addr_type(&p->raddr) &
|
int strict = (ipv6_addr_type(&p->raddr) &
|
||||||
|
@ -1094,6 +1094,24 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ip6gre_calc_hlen(struct ip6_tnl *tunnel)
|
||||||
|
{
|
||||||
|
int t_hlen;
|
||||||
|
|
||||||
|
tunnel->tun_hlen = gre_calc_hlen(tunnel->parms.o_flags);
|
||||||
|
tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
|
||||||
|
|
||||||
|
t_hlen = tunnel->hlen + sizeof(struct ipv6hdr);
|
||||||
|
tunnel->dev->hard_header_len = LL_MAX_HEADER + t_hlen;
|
||||||
|
return t_hlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
|
||||||
|
{
|
||||||
|
ip6gre_tnl_link_config_common(t);
|
||||||
|
ip6gre_tnl_link_config_route(t, set_mtu, ip6gre_calc_hlen(t));
|
||||||
|
}
|
||||||
|
|
||||||
static int ip6gre_tnl_change(struct ip6_tnl *t,
|
static int ip6gre_tnl_change(struct ip6_tnl *t,
|
||||||
const struct __ip6_tnl_parm *p, int set_mtu)
|
const struct __ip6_tnl_parm *p, int set_mtu)
|
||||||
{
|
{
|
||||||
|
@ -1387,11 +1405,7 @@ static int ip6gre_tunnel_init_common(struct net_device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
tunnel->tun_hlen = gre_calc_hlen(tunnel->parms.o_flags);
|
t_hlen = ip6gre_calc_hlen(tunnel);
|
||||||
tunnel->hlen = tunnel->tun_hlen + tunnel->encap_hlen;
|
|
||||||
t_hlen = tunnel->hlen + sizeof(struct ipv6hdr);
|
|
||||||
|
|
||||||
dev->hard_header_len = LL_MAX_HEADER + t_hlen;
|
|
||||||
dev->mtu = ETH_DATA_LEN - t_hlen;
|
dev->mtu = ETH_DATA_LEN - t_hlen;
|
||||||
if (dev->type == ARPHRD_ETHER)
|
if (dev->type == ARPHRD_ETHER)
|
||||||
dev->mtu -= ETH_HLEN;
|
dev->mtu -= ETH_HLEN;
|
||||||
|
|
Loading…
Reference in New Issue