Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df9dcb45 authored by Kazunori MIYAZAWA's avatar Kazunori MIYAZAWA Committed by David S. Miller
Browse files

[IPSEC]: Fix inter address family IPsec tunnel handling.

parent fa86d322
Loading
Loading
Loading
Loading
+23 −0
Original line number Original line Diff line number Diff line
@@ -204,6 +204,7 @@ struct xfrm_state
	 * transformer. */
	 * transformer. */
	const struct xfrm_type	*type;
	const struct xfrm_type	*type;
	struct xfrm_mode	*inner_mode;
	struct xfrm_mode	*inner_mode;
	struct xfrm_mode	*inner_mode_iaf;
	struct xfrm_mode	*outer_mode;
	struct xfrm_mode	*outer_mode;


	/* Security context */
	/* Security context */
@@ -387,6 +388,27 @@ enum {
extern int xfrm_register_mode(struct xfrm_mode *mode, int family);
extern int xfrm_register_mode(struct xfrm_mode *mode, int family);
extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family);
extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family);


static inline int xfrm_af2proto(unsigned int family)
{
	switch(family) {
	case AF_INET:
		return IPPROTO_IPIP;
	case AF_INET6:
		return IPPROTO_IPV6;
	default:
		return 0;
	}
}

static inline struct xfrm_mode *xfrm_ip2inner_mode(struct xfrm_state *x, int ipproto)
{
	if ((ipproto == IPPROTO_IPIP && x->props.family == AF_INET) ||
	    (ipproto == IPPROTO_IPV6 && x->props.family == AF_INET6))
		return x->inner_mode;
	else
		return x->inner_mode_iaf;
}

struct xfrm_tmpl
struct xfrm_tmpl
{
{
/* id in template is interpreted as:
/* id in template is interpreted as:
@@ -1253,6 +1275,7 @@ extern int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi,
extern int xfrm_input_resume(struct sk_buff *skb, int nexthdr);
extern int xfrm_input_resume(struct sk_buff *skb, int nexthdr);
extern int xfrm_output_resume(struct sk_buff *skb, int err);
extern int xfrm_output_resume(struct sk_buff *skb, int err);
extern int xfrm_output(struct sk_buff *skb);
extern int xfrm_output(struct sk_buff *skb);
extern int xfrm_inner_extract_output(struct xfrm_state *x, struct sk_buff *skb);
extern int xfrm4_extract_header(struct sk_buff *skb);
extern int xfrm4_extract_header(struct sk_buff *skb);
extern int xfrm4_extract_input(struct xfrm_state *x, struct sk_buff *skb);
extern int xfrm4_extract_input(struct xfrm_state *x, struct sk_buff *skb);
extern int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
extern int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
+1 −1
Original line number Original line Diff line number Diff line
@@ -41,7 +41,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
	top_iph->ihl = 5;
	top_iph->ihl = 5;
	top_iph->version = 4;
	top_iph->version = 4;


	top_iph->protocol = x->inner_mode->afinfo->proto;
	top_iph->protocol = xfrm_af2proto(skb->dst->ops->family);


	/* DS disclosed */
	/* DS disclosed */
	top_iph->tos = INET_ECN_encapsulate(XFRM_MODE_SKB_CB(skb)->tos,
	top_iph->tos = INET_ECN_encapsulate(XFRM_MODE_SKB_CB(skb)->tos,
+1 −1
Original line number Original line Diff line number Diff line
@@ -56,7 +56,7 @@ int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb)
{
{
	int err;
	int err;


	err = x->inner_mode->afinfo->extract_output(x, skb);
	err = xfrm_inner_extract_output(x, skb);
	if (err)
	if (err)
		return err;
		return err;


+1 −1
Original line number Original line Diff line number Diff line
@@ -45,7 +45,7 @@ static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)


	memcpy(top_iph->flow_lbl, XFRM_MODE_SKB_CB(skb)->flow_lbl,
	memcpy(top_iph->flow_lbl, XFRM_MODE_SKB_CB(skb)->flow_lbl,
	       sizeof(top_iph->flow_lbl));
	       sizeof(top_iph->flow_lbl));
	top_iph->nexthdr = x->inner_mode->afinfo->proto;
	top_iph->nexthdr = xfrm_af2proto(skb->dst->ops->family);


	dsfield = XFRM_MODE_SKB_CB(skb)->tos;
	dsfield = XFRM_MODE_SKB_CB(skb)->tos;
	dsfield = INET_ECN_encapsulate(dsfield, dsfield);
	dsfield = INET_ECN_encapsulate(dsfield, dsfield);
+1 −1
Original line number Original line Diff line number Diff line
@@ -62,7 +62,7 @@ int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb)
{
{
	int err;
	int err;


	err = x->inner_mode->afinfo->extract_output(x, skb);
	err = xfrm_inner_extract_output(x, skb);
	if (err)
	if (err)
		return err;
		return err;


Loading