fou: Split out {fou,gue}_build_header

Create __fou_build_header and __gue_build_header. These implement the
protocol generic parts of building the fou and gue header.
fou_build_header and gue_build_header implement the IPv4 specific
functions and call the __*_build_header functions.

Signed-off-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Tom Herbert 2016-05-18 09:06:15 -07:00 committed by David S. Miller
parent 440924bbc0
commit dc969b81eb
2 changed files with 41 additions and 14 deletions

View File

@ -11,9 +11,9 @@
size_t fou_encap_hlen(struct ip_tunnel_encap *e); size_t fou_encap_hlen(struct ip_tunnel_encap *e);
static size_t gue_encap_hlen(struct ip_tunnel_encap *e); static size_t gue_encap_hlen(struct ip_tunnel_encap *e);
int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
u8 *protocol, struct flowi4 *fl4); u8 *protocol, __be16 *sport, int type);
int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, int __gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
u8 *protocol, struct flowi4 *fl4); u8 *protocol, __be16 *sport, int type);
#endif #endif

View File

@ -780,6 +780,22 @@ static void fou_build_udp(struct sk_buff *skb, struct ip_tunnel_encap *e,
*protocol = IPPROTO_UDP; *protocol = IPPROTO_UDP;
} }
int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
u8 *protocol, __be16 *sport, int type)
{
int err;
err = iptunnel_handle_offloads(skb, type);
if (err)
return err;
*sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
skb, 0, 0, false);
return 0;
}
EXPORT_SYMBOL(__fou_build_header);
int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
u8 *protocol, struct flowi4 *fl4) u8 *protocol, struct flowi4 *fl4)
{ {
@ -788,26 +804,21 @@ int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
__be16 sport; __be16 sport;
int err; int err;
err = iptunnel_handle_offloads(skb, type); err = __fou_build_header(skb, e, protocol, &sport, type);
if (err) if (err)
return err; return err;
sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
skb, 0, 0, false);
fou_build_udp(skb, e, fl4, protocol, sport); fou_build_udp(skb, e, fl4, protocol, sport);
return 0; return 0;
} }
EXPORT_SYMBOL(fou_build_header); EXPORT_SYMBOL(fou_build_header);
int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, int __gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
u8 *protocol, struct flowi4 *fl4) u8 *protocol, __be16 *sport, int type)
{ {
int type = e->flags & TUNNEL_ENCAP_FLAG_CSUM ? SKB_GSO_UDP_TUNNEL_CSUM :
SKB_GSO_UDP_TUNNEL;
struct guehdr *guehdr; struct guehdr *guehdr;
size_t hdrlen, optlen = 0; size_t hdrlen, optlen = 0;
__be16 sport;
void *data; void *data;
bool need_priv = false; bool need_priv = false;
int err; int err;
@ -826,7 +837,7 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
return err; return err;
/* Get source port (based on flow hash) before skb_push */ /* Get source port (based on flow hash) before skb_push */
sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev), *sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
skb, 0, 0, false); skb, 0, 0, false);
hdrlen = sizeof(struct guehdr) + optlen; hdrlen = sizeof(struct guehdr) + optlen;
@ -872,6 +883,22 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
} }
return 0;
}
EXPORT_SYMBOL(__gue_build_header);
int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
u8 *protocol, struct flowi4 *fl4)
{
int type = e->flags & TUNNEL_ENCAP_FLAG_CSUM ? SKB_GSO_UDP_TUNNEL_CSUM :
SKB_GSO_UDP_TUNNEL;
__be16 sport;
int err;
err = __gue_build_header(skb, e, protocol, &sport, type);
if (err)
return err;
fou_build_udp(skb, e, fl4, protocol, sport); fou_build_udp(skb, e, fl4, protocol, sport);
return 0; return 0;