ip6_gre: set DSCP for non-IP
The current code always forces a dscp of 0 for all non-IP frames. However when setting a specific TOS with the command ip link add name tep0 type ip6gretap local fdd1:ced0:5d88:3fce::1 remote fdd1:ced0:5d88:3fce::2 tos 0xa0 one would expect all GRE encapsulated frames to have a TOS of 0xA0. and not only when the payload is IPv4/IPv6. Signed-off-by: Matthias May <matthias.may@westermo.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7ae29fd1be
commit
41337f52b9
@ -701,6 +701,33 @@ static int prepare_ip6gre_xmit_ipv6(struct sk_buff *skb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int prepare_ip6gre_xmit_other(struct sk_buff *skb,
|
||||||
|
struct net_device *dev,
|
||||||
|
struct flowi6 *fl6, __u8 *dsfield,
|
||||||
|
int *encap_limit)
|
||||||
|
{
|
||||||
|
struct ip6_tnl *t = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
|
||||||
|
*encap_limit = t->parms.encap_limit;
|
||||||
|
|
||||||
|
memcpy(fl6, &t->fl.u.ip6, sizeof(*fl6));
|
||||||
|
|
||||||
|
if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS)
|
||||||
|
*dsfield = 0;
|
||||||
|
else
|
||||||
|
*dsfield = ip6_tclass(t->parms.flowinfo);
|
||||||
|
|
||||||
|
if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK)
|
||||||
|
fl6->flowi6_mark = skb->mark;
|
||||||
|
else
|
||||||
|
fl6->flowi6_mark = t->parms.fwmark;
|
||||||
|
|
||||||
|
fl6->flowi6_uid = sock_net_uid(dev_net(dev), NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct ip_tunnel_info *skb_tunnel_info_txcheck(struct sk_buff *skb)
|
static struct ip_tunnel_info *skb_tunnel_info_txcheck(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct ip_tunnel_info *tun_info;
|
struct ip_tunnel_info *tun_info;
|
||||||
@ -868,20 +895,18 @@ static int ip6gre_xmit_other(struct sk_buff *skb, struct net_device *dev)
|
|||||||
struct ip6_tnl *t = netdev_priv(dev);
|
struct ip6_tnl *t = netdev_priv(dev);
|
||||||
int encap_limit = -1;
|
int encap_limit = -1;
|
||||||
struct flowi6 fl6;
|
struct flowi6 fl6;
|
||||||
|
__u8 dsfield = 0;
|
||||||
__u32 mtu;
|
__u32 mtu;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT))
|
if (!t->parms.collect_md &&
|
||||||
encap_limit = t->parms.encap_limit;
|
prepare_ip6gre_xmit_other(skb, dev, &fl6, &dsfield, &encap_limit))
|
||||||
|
return -1;
|
||||||
if (!t->parms.collect_md)
|
|
||||||
memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6));
|
|
||||||
|
|
||||||
err = gre_handle_offloads(skb, !!(t->parms.o_flags & TUNNEL_CSUM));
|
err = gre_handle_offloads(skb, !!(t->parms.o_flags & TUNNEL_CSUM));
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
err = __gre6_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, skb->protocol);
|
||||||
err = __gre6_xmit(skb, dev, 0, &fl6, encap_limit, &mtu, skb->protocol);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user