static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb)
{
	int err = -EINVAL;

	if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPV6)
		goto out;
	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
		goto out;

	if (skb_cloned(skb) &&
	    (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
		goto out;

	if (x->props.flags & XFRM_STATE_DECAP_DSCP)
		ipv6_copy_dscp(ipv6_get_dsfield(ipv6_hdr(skb)),
			       ipipv6_hdr(skb));
	if (!(x->props.flags & XFRM_STATE_NOECN))
		ipip6_ecn_decapsulate(skb);

	skb_reset_network_header(skb);
	skb_mac_header_rebuild(skb);

	err = 0;

out:
	return err;
}
예제 #2
0
static inline void ipip6_ecn_decapsulate(struct sk_buff *skb)
{
	struct ipv6hdr *inner_iph = ipipv6_hdr(skb);

	if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos))
		IP6_ECN_set_ce(skb, inner_iph);
}
static inline void ipip6_ecn_decapsulate(struct sk_buff *skb)
{
	const struct ipv6hdr *outer_iph = ipv6_hdr(skb);
	struct ipv6hdr *inner_iph = ipipv6_hdr(skb);

	if (INET_ECN_is_ce(ipv6_get_dsfield(outer_iph)))
		IP6_ECN_set_ce(inner_iph);
}
예제 #4
0
파일: stubl.c 프로젝트: edesiocs/stubl
static int check_stubl_source(struct sk_buff *skb)
{
	int err;
	__be32 v4src;
	struct in6_addr *v6src;
	__be32 decrypted_v4addr;

	v4src = ip_hdr(skb)->saddr;
	v6src = &ipipv6_hdr(skb)->saddr;

	err = extract_ipv4_endpoint(v6src, &decrypted_v4addr);
	if (err < 0)
		return err;

	if (decrypted_v4addr != v4src)
		return -EINVAL;

	return 0;
}