Commit dc969b81 authored by Tom Herbert's avatar Tom Herbert Committed by David S. Miller

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: default avatarTom Herbert <tom@herbertland.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 440924bb
...@@ -11,9 +11,9 @@ ...@@ -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
...@@ -780,6 +780,22 @@ static void fou_build_udp(struct sk_buff *skb, struct ip_tunnel_encap *e, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
......
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