udp_tunnel_core.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/module.h>
  3. #include <linux/errno.h>
  4. #include <linux/socket.h>
  5. #include <linux/kernel.h>
  6. #include <net/dst_metadata.h>
  7. #include <net/udp.h>
  8. #include <net/udp_tunnel.h>
  9. #include <net/inet_dscp.h>
  10. int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
  11. struct socket **sockp)
  12. {
  13. int err;
  14. struct socket *sock = NULL;
  15. struct sockaddr_in udp_addr;
  16. err = sock_create_kern(net, AF_INET, SOCK_DGRAM, 0, &sock);
  17. if (err < 0)
  18. goto error;
  19. if (cfg->bind_ifindex) {
  20. err = sock_bindtoindex(sock->sk, cfg->bind_ifindex, true);
  21. if (err < 0)
  22. goto error;
  23. }
  24. udp_addr.sin_family = AF_INET;
  25. udp_addr.sin_addr = cfg->local_ip;
  26. udp_addr.sin_port = cfg->local_udp_port;
  27. err = kernel_bind(sock, (struct sockaddr *)&udp_addr,
  28. sizeof(udp_addr));
  29. if (err < 0)
  30. goto error;
  31. if (cfg->peer_udp_port) {
  32. udp_addr.sin_family = AF_INET;
  33. udp_addr.sin_addr = cfg->peer_ip;
  34. udp_addr.sin_port = cfg->peer_udp_port;
  35. err = kernel_connect(sock, (struct sockaddr *)&udp_addr,
  36. sizeof(udp_addr), 0);
  37. if (err < 0)
  38. goto error;
  39. }
  40. sock->sk->sk_no_check_tx = !cfg->use_udp_checksums;
  41. *sockp = sock;
  42. return 0;
  43. error:
  44. if (sock) {
  45. kernel_sock_shutdown(sock, SHUT_RDWR);
  46. sock_release(sock);
  47. }
  48. *sockp = NULL;
  49. return err;
  50. }
  51. EXPORT_SYMBOL(udp_sock_create4);
  52. void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
  53. struct udp_tunnel_sock_cfg *cfg)
  54. {
  55. struct sock *sk = sock->sk;
  56. /* Disable multicast loopback */
  57. inet_clear_bit(MC_LOOP, sk);
  58. /* Enable CHECKSUM_UNNECESSARY to CHECKSUM_COMPLETE conversion */
  59. inet_inc_convert_csum(sk);
  60. rcu_assign_sk_user_data(sk, cfg->sk_user_data);
  61. udp_sk(sk)->encap_type = cfg->encap_type;
  62. udp_sk(sk)->encap_rcv = cfg->encap_rcv;
  63. udp_sk(sk)->encap_err_rcv = cfg->encap_err_rcv;
  64. udp_sk(sk)->encap_err_lookup = cfg->encap_err_lookup;
  65. udp_sk(sk)->encap_destroy = cfg->encap_destroy;
  66. udp_sk(sk)->gro_receive = cfg->gro_receive;
  67. udp_sk(sk)->gro_complete = cfg->gro_complete;
  68. udp_tunnel_encap_enable(sk);
  69. }
  70. EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
  71. void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock,
  72. unsigned short type)
  73. {
  74. struct sock *sk = sock->sk;
  75. struct udp_tunnel_info ti;
  76. ti.type = type;
  77. ti.sa_family = sk->sk_family;
  78. ti.port = inet_sk(sk)->inet_sport;
  79. udp_tunnel_nic_add_port(dev, &ti);
  80. }
  81. EXPORT_SYMBOL_GPL(udp_tunnel_push_rx_port);
  82. void udp_tunnel_drop_rx_port(struct net_device *dev, struct socket *sock,
  83. unsigned short type)
  84. {
  85. struct sock *sk = sock->sk;
  86. struct udp_tunnel_info ti;
  87. ti.type = type;
  88. ti.sa_family = sk->sk_family;
  89. ti.port = inet_sk(sk)->inet_sport;
  90. udp_tunnel_nic_del_port(dev, &ti);
  91. }
  92. EXPORT_SYMBOL_GPL(udp_tunnel_drop_rx_port);
  93. /* Notify netdevs that UDP port started listening */
  94. void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type)
  95. {
  96. struct sock *sk = sock->sk;
  97. struct net *net = sock_net(sk);
  98. struct udp_tunnel_info ti;
  99. struct net_device *dev;
  100. ti.type = type;
  101. ti.sa_family = sk->sk_family;
  102. ti.port = inet_sk(sk)->inet_sport;
  103. rcu_read_lock();
  104. for_each_netdev_rcu(net, dev) {
  105. udp_tunnel_nic_add_port(dev, &ti);
  106. }
  107. rcu_read_unlock();
  108. }
  109. EXPORT_SYMBOL_GPL(udp_tunnel_notify_add_rx_port);
  110. /* Notify netdevs that UDP port is no more listening */
  111. void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type)
  112. {
  113. struct sock *sk = sock->sk;
  114. struct net *net = sock_net(sk);
  115. struct udp_tunnel_info ti;
  116. struct net_device *dev;
  117. ti.type = type;
  118. ti.sa_family = sk->sk_family;
  119. ti.port = inet_sk(sk)->inet_sport;
  120. rcu_read_lock();
  121. for_each_netdev_rcu(net, dev) {
  122. udp_tunnel_nic_del_port(dev, &ti);
  123. }
  124. rcu_read_unlock();
  125. }
  126. EXPORT_SYMBOL_GPL(udp_tunnel_notify_del_rx_port);
  127. void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
  128. __be32 src, __be32 dst, __u8 tos, __u8 ttl,
  129. __be16 df, __be16 src_port, __be16 dst_port,
  130. bool xnet, bool nocheck)
  131. {
  132. struct udphdr *uh;
  133. __skb_push(skb, sizeof(*uh));
  134. skb_reset_transport_header(skb);
  135. uh = udp_hdr(skb);
  136. uh->dest = dst_port;
  137. uh->source = src_port;
  138. uh->len = htons(skb->len);
  139. memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
  140. udp_set_csum(nocheck, skb, src, dst, skb->len);
  141. iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, xnet);
  142. }
  143. EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb);
  144. void udp_tunnel_sock_release(struct socket *sock)
  145. {
  146. rcu_assign_sk_user_data(sock->sk, NULL);
  147. synchronize_rcu();
  148. kernel_sock_shutdown(sock, SHUT_RDWR);
  149. sock_release(sock);
  150. }
  151. EXPORT_SYMBOL_GPL(udp_tunnel_sock_release);
  152. struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short family,
  153. const unsigned long *flags,
  154. __be64 tunnel_id, int md_size)
  155. {
  156. struct metadata_dst *tun_dst;
  157. struct ip_tunnel_info *info;
  158. if (family == AF_INET)
  159. tun_dst = ip_tun_rx_dst(skb, flags, tunnel_id, md_size);
  160. else
  161. tun_dst = ipv6_tun_rx_dst(skb, flags, tunnel_id, md_size);
  162. if (!tun_dst)
  163. return NULL;
  164. info = &tun_dst->u.tun_info;
  165. info->key.tp_src = udp_hdr(skb)->source;
  166. info->key.tp_dst = udp_hdr(skb)->dest;
  167. if (udp_hdr(skb)->check)
  168. __set_bit(IP_TUNNEL_CSUM_BIT, info->key.tun_flags);
  169. return tun_dst;
  170. }
  171. EXPORT_SYMBOL_GPL(udp_tun_rx_dst);
  172. struct rtable *udp_tunnel_dst_lookup(struct sk_buff *skb,
  173. struct net_device *dev,
  174. struct net *net, int oif,
  175. __be32 *saddr,
  176. const struct ip_tunnel_key *key,
  177. __be16 sport, __be16 dport, u8 tos,
  178. struct dst_cache *dst_cache)
  179. {
  180. struct rtable *rt = NULL;
  181. struct flowi4 fl4;
  182. #ifdef CONFIG_DST_CACHE
  183. if (dst_cache) {
  184. rt = dst_cache_get_ip4(dst_cache, saddr);
  185. if (rt)
  186. return rt;
  187. }
  188. #endif
  189. memset(&fl4, 0, sizeof(fl4));
  190. fl4.flowi4_mark = skb->mark;
  191. fl4.flowi4_proto = IPPROTO_UDP;
  192. fl4.flowi4_oif = oif;
  193. fl4.daddr = key->u.ipv4.dst;
  194. fl4.saddr = key->u.ipv4.src;
  195. fl4.fl4_dport = dport;
  196. fl4.fl4_sport = sport;
  197. fl4.flowi4_tos = tos & INET_DSCP_MASK;
  198. fl4.flowi4_flags = key->flow_flags;
  199. rt = ip_route_output_key(net, &fl4);
  200. if (IS_ERR(rt)) {
  201. netdev_dbg(dev, "no route to %pI4\n", &fl4.daddr);
  202. return ERR_PTR(-ENETUNREACH);
  203. }
  204. if (rt->dst.dev == dev) { /* is this necessary? */
  205. netdev_dbg(dev, "circular route to %pI4\n", &fl4.daddr);
  206. ip_rt_put(rt);
  207. return ERR_PTR(-ELOOP);
  208. }
  209. #ifdef CONFIG_DST_CACHE
  210. if (dst_cache)
  211. dst_cache_set_ip4(dst_cache, &rt->dst, fl4.saddr);
  212. #endif
  213. *saddr = fl4.saddr;
  214. return rt;
  215. }
  216. EXPORT_SYMBOL_GPL(udp_tunnel_dst_lookup);
  217. MODULE_DESCRIPTION("IPv4 Foo over UDP tunnel driver");
  218. MODULE_LICENSE("GPL");