git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.3
[linux-2.6.git]
/
net
/
ipv6
/
ip6_tunnel.c
diff --git
a/net/ipv6/ip6_tunnel.c
b/net/ipv6/ip6_tunnel.c
index
0c8db03
..
c75dc34
100644
(file)
--- a/
net/ipv6/ip6_tunnel.c
+++ b/
net/ipv6/ip6_tunnel.c
@@
-48,6
+48,8
@@
#include <net/addrconf.h>
#include <net/ip6_tunnel.h>
#include <net/xfrm.h>
#include <net/addrconf.h>
#include <net/ip6_tunnel.h>
#include <net/xfrm.h>
+#include <net/dsfield.h>
+#include <net/inet_ecn.h>
MODULE_AUTHOR("Ville Nuorvala");
MODULE_DESCRIPTION("IPv6-in-IPv6 tunnel");
MODULE_AUTHOR("Ville Nuorvala");
MODULE_DESCRIPTION("IPv6-in-IPv6 tunnel");
@@
-490,6
+492,15
@@
out:
read_unlock(&ip6ip6_lock);
}
read_unlock(&ip6ip6_lock);
}
+static inline void ip6ip6_ecn_decapsulate(struct ipv6hdr *outer_iph,
+ struct sk_buff *skb)
+{
+ struct ipv6hdr *inner_iph = skb->nh.ipv6h;
+
+ if (INET_ECN_is_ce(ipv6_get_dsfield(outer_iph)))
+ IP6_ECN_set_ce(inner_iph);
+}
+
/**
* ip6ip6_rcv - decapsulate IPv6 packet and retransmit it locally
* @skb: received socket buffer
/**
* ip6ip6_rcv - decapsulate IPv6 packet and retransmit it locally
* @skb: received socket buffer
@@
-531,6
+542,9
@@
ip6ip6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
skb->dev = t->dev;
dst_release(skb->dst);
skb->dst = NULL;
skb->dev = t->dev;
dst_release(skb->dst);
skb->dst = NULL;
+ if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY)
+ ipv6_copy_dscp(ipv6h, skb->nh.ipv6h);
+ ip6ip6_ecn_decapsulate(ipv6h, skb);
t->stat.rx_packets++;
t->stat.rx_bytes += skb->len;
netif_rx(skb);
t->stat.rx_packets++;
t->stat.rx_bytes += skb->len;
netif_rx(skb);
@@
-621,6
+635,7
@@
ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
u8 proto;
int err;
int pkt_len;
u8 proto;
int err;
int pkt_len;
+ int dsfield;
if (t->recursion++) {
stats->collisions++;
if (t->recursion++) {
stats->collisions++;
@@
-646,6
+661,7
@@
ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
memcpy(&fl, &t->fl, sizeof (fl));
proto = fl.proto;
memcpy(&fl, &t->fl, sizeof (fl));
proto = fl.proto;
+ dsfield = ipv6_get_dsfield(ipv6h);
if ((t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS))
fl.fl6_flowlabel |= (*(__u32 *) ipv6h & IPV6_TCLASS_MASK);
if ((t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL))
if ((t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS))
fl.fl6_flowlabel |= (*(__u32 *) ipv6h & IPV6_TCLASS_MASK);
if ((t->parms.flags & IP6_TNL_F_USE_ORIG_FLOWLABEL))
@@
-717,6
+733,8
@@
ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
skb->nh.raw = skb_push(skb, sizeof(struct ipv6hdr));
ipv6h = skb->nh.ipv6h;
*(u32*)ipv6h = fl.fl6_flowlabel | htonl(0x60000000);
skb->nh.raw = skb_push(skb, sizeof(struct ipv6hdr));
ipv6h = skb->nh.ipv6h;
*(u32*)ipv6h = fl.fl6_flowlabel | htonl(0x60000000);
+ dsfield = INET_ECN_encapsulate(0, dsfield);
+ ipv6_change_dsfield(ipv6h, ~INET_ECN_MASK, dsfield);
ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
ipv6h->hop_limit = t->parms.hop_limit;
ipv6h->nexthdr = proto;
ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
ipv6h->hop_limit = t->parms.hop_limit;
ipv6h->nexthdr = proto;