Commit 8359925b authored by Yasuyuki Kozakai's avatar Yasuyuki Kozakai Committed by David S. Miller

[IPV6] IP6TUNNEL: Split out generic routine in ip6ip6_rcv().

This enables to add IPv4/IPv6 specific handling later,
Signed-off-by: default avatarYasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e490d1d8
...@@ -513,14 +513,17 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, ...@@ -513,14 +513,17 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
return 0; return 0;
} }
static inline void ip6ip6_ecn_decapsulate(struct ipv6hdr *outer_iph, static void ip6ip6_dscp_ecn_decapsulate(struct ip6_tnl *t,
struct sk_buff *skb) struct ipv6hdr *ipv6h,
struct sk_buff *skb)
{ {
struct ipv6hdr *inner_iph = skb->nh.ipv6h; if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY)
ipv6_copy_dscp(ipv6h, skb->nh.ipv6h);
if (INET_ECN_is_ce(ipv6_get_dsfield(outer_iph))) if (INET_ECN_is_ce(ipv6_get_dsfield(ipv6h)))
IP6_ECN_set_ce(inner_iph); IP6_ECN_set_ce(skb->nh.ipv6h);
} }
static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t) static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
{ {
struct ip6_tnl_parm *p = &t->parms; struct ip6_tnl_parm *p = &t->parms;
...@@ -546,12 +549,16 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t) ...@@ -546,12 +549,16 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
/** /**
* ip6ip6_rcv - decapsulate IPv6 packet and retransmit it locally * ip6ip6_rcv - decapsulate IPv6 packet and retransmit it locally
* @skb: received socket buffer * @skb: received socket buffer
* @protocol: ethernet protocol ID
* @dscp_ecn_decapsulate: the function to decapsulate DSCP code and ECN
* *
* Return: 0 * Return: 0
**/ **/
static int static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol,
ip6ip6_rcv(struct sk_buff *skb) void (*dscp_ecn_decapsulate)(struct ip6_tnl *t,
struct ipv6hdr *ipv6h,
struct sk_buff *skb))
{ {
struct ipv6hdr *ipv6h; struct ipv6hdr *ipv6h;
struct ip6_tnl *t; struct ip6_tnl *t;
...@@ -574,16 +581,16 @@ ip6ip6_rcv(struct sk_buff *skb) ...@@ -574,16 +581,16 @@ ip6ip6_rcv(struct sk_buff *skb)
secpath_reset(skb); secpath_reset(skb);
skb->mac.raw = skb->nh.raw; skb->mac.raw = skb->nh.raw;
skb->nh.raw = skb->data; skb->nh.raw = skb->data;
skb->protocol = htons(ETH_P_IPV6); skb->protocol = htons(protocol);
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
skb->dev = t->dev; skb->dev = t->dev;
dst_release(skb->dst); dst_release(skb->dst);
skb->dst = NULL; skb->dst = NULL;
nf_reset(skb); nf_reset(skb);
if (t->parms.flags & IP6_TNL_F_RCV_DSCP_COPY)
ipv6_copy_dscp(ipv6h, skb->nh.ipv6h); dscp_ecn_decapsulate(t, ipv6h, skb);
ip6ip6_ecn_decapsulate(ipv6h, skb);
t->stat.rx_packets++; t->stat.rx_packets++;
t->stat.rx_bytes += skb->len; t->stat.rx_bytes += skb->len;
netif_rx(skb); netif_rx(skb);
...@@ -598,6 +605,11 @@ ip6ip6_rcv(struct sk_buff *skb) ...@@ -598,6 +605,11 @@ ip6ip6_rcv(struct sk_buff *skb)
return 0; return 0;
} }
static int ip6ip6_rcv(struct sk_buff *skb)
{
return ip6_tnl_rcv(skb, ETH_P_IPV6, ip6ip6_dscp_ecn_decapsulate);
}
struct ipv6_tel_txoption { struct ipv6_tel_txoption {
struct ipv6_txoptions ops; struct ipv6_txoptions ops;
__u8 dst_opt[8]; __u8 dst_opt[8];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment