~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ipv4/udp_tunnel.c

Version: ~ [ linux-5.19-rc3 ] ~ [ linux-5.18.5 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.48 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.123 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.199 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.248 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.284 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.319 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.302 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #include <linux/module.h>
  2 #include <linux/errno.h>
  3 #include <linux/socket.h>
  4 #include <linux/udp.h>
  5 #include <linux/types.h>
  6 #include <linux/kernel.h>
  7 #include <net/udp.h>
  8 #include <net/udp_tunnel.h>
  9 #include <net/net_namespace.h>
 10 
 11 int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
 12                      struct socket **sockp)
 13 {
 14         int err;
 15         struct socket *sock = NULL;
 16         struct sockaddr_in udp_addr;
 17 
 18         err = sock_create_kern(net, AF_INET, SOCK_DGRAM, 0, &sock);
 19         if (err < 0)
 20                 goto error;
 21 
 22         udp_addr.sin_family = AF_INET;
 23         udp_addr.sin_addr = cfg->local_ip;
 24         udp_addr.sin_port = cfg->local_udp_port;
 25         err = kernel_bind(sock, (struct sockaddr *)&udp_addr,
 26                           sizeof(udp_addr));
 27         if (err < 0)
 28                 goto error;
 29 
 30         if (cfg->peer_udp_port) {
 31                 udp_addr.sin_family = AF_INET;
 32                 udp_addr.sin_addr = cfg->peer_ip;
 33                 udp_addr.sin_port = cfg->peer_udp_port;
 34                 err = kernel_connect(sock, (struct sockaddr *)&udp_addr,
 35                                      sizeof(udp_addr), 0);
 36                 if (err < 0)
 37                         goto error;
 38         }
 39 
 40         sock->sk->sk_no_check_tx = !cfg->use_udp_checksums;
 41 
 42         *sockp = sock;
 43         return 0;
 44 
 45 error:
 46         if (sock) {
 47                 kernel_sock_shutdown(sock, SHUT_RDWR);
 48                 sock_release(sock);
 49         }
 50         *sockp = NULL;
 51         return err;
 52 }
 53 EXPORT_SYMBOL(udp_sock_create4);
 54 
 55 void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
 56                            struct udp_tunnel_sock_cfg *cfg)
 57 {
 58         struct sock *sk = sock->sk;
 59 
 60         /* Disable multicast loopback */
 61         inet_sk(sk)->mc_loop = 0;
 62 
 63         /* Enable CHECKSUM_UNNECESSARY to CHECKSUM_COMPLETE conversion */
 64         inet_inc_convert_csum(sk);
 65 
 66         rcu_assign_sk_user_data(sk, cfg->sk_user_data);
 67 
 68         udp_sk(sk)->encap_type = cfg->encap_type;
 69         udp_sk(sk)->encap_rcv = cfg->encap_rcv;
 70         udp_sk(sk)->encap_destroy = cfg->encap_destroy;
 71 
 72         udp_tunnel_encap_enable(sock);
 73 }
 74 EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
 75 
 76 int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
 77                         __be32 src, __be32 dst, __u8 tos, __u8 ttl,
 78                         __be16 df, __be16 src_port, __be16 dst_port,
 79                         bool xnet, bool nocheck)
 80 {
 81         struct udphdr *uh;
 82 
 83         __skb_push(skb, sizeof(*uh));
 84         skb_reset_transport_header(skb);
 85         uh = udp_hdr(skb);
 86 
 87         uh->dest = dst_port;
 88         uh->source = src_port;
 89         uh->len = htons(skb->len);
 90 
 91         udp_set_csum(nocheck, skb, src, dst, skb->len);
 92 
 93         return iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP,
 94                              tos, ttl, df, xnet);
 95 }
 96 EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb);
 97 
 98 void udp_tunnel_sock_release(struct socket *sock)
 99 {
100         rcu_assign_sk_user_data(sock->sk, NULL);
101         kernel_sock_shutdown(sock, SHUT_RDWR);
102         sock_release(sock);
103 }
104 EXPORT_SYMBOL_GPL(udp_tunnel_sock_release);
105 
106 MODULE_LICENSE("GPL");
107 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp