|
@@ -1,6 +1,14 @@
|
|
|
#ifndef __NET_UDP_TUNNEL_H
|
|
|
#define __NET_UDP_TUNNEL_H
|
|
|
|
|
|
+#include <net/ip_tunnels.h>
|
|
|
+#include <net/udp.h>
|
|
|
+
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
|
+#include <net/ipv6.h>
|
|
|
+#include <net/addrconf.h>
|
|
|
+#endif
|
|
|
+
|
|
|
struct udp_port_cfg {
|
|
|
u8 family;
|
|
|
|
|
@@ -53,4 +61,53 @@ static inline int udp_sock_create(struct net *net,
|
|
|
return -EPFNOSUPPORT;
|
|
|
}
|
|
|
|
|
|
+typedef int (*udp_tunnel_encap_rcv_t)(struct sock *sk, struct sk_buff *skb);
|
|
|
+typedef void (*udp_tunnel_encap_destroy_t)(struct sock *sk);
|
|
|
+
|
|
|
+struct udp_tunnel_sock_cfg {
|
|
|
+ void *sk_user_data; /* user data used by encap_rcv call back */
|
|
|
+ /* Used for setting up udp_sock fields, see udp.h for details */
|
|
|
+ __u8 encap_type;
|
|
|
+ udp_tunnel_encap_rcv_t encap_rcv;
|
|
|
+ udp_tunnel_encap_destroy_t encap_destroy;
|
|
|
+};
|
|
|
+
|
|
|
+/* Setup the given (UDP) sock to receive UDP encapsulated packets */
|
|
|
+void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
|
|
|
+ struct udp_tunnel_sock_cfg *sock_cfg);
|
|
|
+
|
|
|
+/* Transmit the skb using UDP encapsulation. */
|
|
|
+int udp_tunnel_xmit_skb(struct socket *sock, struct rtable *rt,
|
|
|
+ struct sk_buff *skb, __be32 src, __be32 dst,
|
|
|
+ __u8 tos, __u8 ttl, __be16 df, __be16 src_port,
|
|
|
+ __be16 dst_port, bool xnet);
|
|
|
+
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
|
+int udp_tunnel6_xmit_skb(struct socket *sock, struct dst_entry *dst,
|
|
|
+ struct sk_buff *skb, struct net_device *dev,
|
|
|
+ struct in6_addr *saddr, struct in6_addr *daddr,
|
|
|
+ __u8 prio, __u8 ttl, __be16 src_port,
|
|
|
+ __be16 dst_port);
|
|
|
+#endif
|
|
|
+
|
|
|
+void udp_tunnel_sock_release(struct socket *sock);
|
|
|
+
|
|
|
+static inline struct sk_buff *udp_tunnel_handle_offloads(struct sk_buff *skb,
|
|
|
+ bool udp_csum)
|
|
|
+{
|
|
|
+ int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
|
|
|
+
|
|
|
+ return iptunnel_handle_offloads(skb, udp_csum, type);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void udp_tunnel_encap_enable(struct socket *sock)
|
|
|
+{
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
|
+ if (sock->sk->sk_family == PF_INET6)
|
|
|
+ ipv6_stub->udpv6_encap_enable();
|
|
|
+ else
|
|
|
+#endif
|
|
|
+ udp_encap_enable();
|
|
|
+}
|
|
|
+
|
|
|
#endif
|