0001
0002 #include <linux/module.h>
0003 #include <linux/errno.h>
0004 #include <linux/socket.h>
0005 #include <linux/kernel.h>
0006 #include <net/dst_metadata.h>
0007 #include <net/udp.h>
0008 #include <net/udp_tunnel.h>
0009
0010 int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
0011 struct socket **sockp)
0012 {
0013 int err;
0014 struct socket *sock = NULL;
0015 struct sockaddr_in udp_addr;
0016
0017 err = sock_create_kern(net, AF_INET, SOCK_DGRAM, 0, &sock);
0018 if (err < 0)
0019 goto error;
0020
0021 if (cfg->bind_ifindex) {
0022 err = sock_bindtoindex(sock->sk, cfg->bind_ifindex, true);
0023 if (err < 0)
0024 goto error;
0025 }
0026
0027 udp_addr.sin_family = AF_INET;
0028 udp_addr.sin_addr = cfg->local_ip;
0029 udp_addr.sin_port = cfg->local_udp_port;
0030 err = kernel_bind(sock, (struct sockaddr *)&udp_addr,
0031 sizeof(udp_addr));
0032 if (err < 0)
0033 goto error;
0034
0035 if (cfg->peer_udp_port) {
0036 udp_addr.sin_family = AF_INET;
0037 udp_addr.sin_addr = cfg->peer_ip;
0038 udp_addr.sin_port = cfg->peer_udp_port;
0039 err = kernel_connect(sock, (struct sockaddr *)&udp_addr,
0040 sizeof(udp_addr), 0);
0041 if (err < 0)
0042 goto error;
0043 }
0044
0045 sock->sk->sk_no_check_tx = !cfg->use_udp_checksums;
0046
0047 *sockp = sock;
0048 return 0;
0049
0050 error:
0051 if (sock) {
0052 kernel_sock_shutdown(sock, SHUT_RDWR);
0053 sock_release(sock);
0054 }
0055 *sockp = NULL;
0056 return err;
0057 }
0058 EXPORT_SYMBOL(udp_sock_create4);
0059
0060 void setup_udp_tunnel_sock(struct net *net, struct socket *sock,
0061 struct udp_tunnel_sock_cfg *cfg)
0062 {
0063 struct sock *sk = sock->sk;
0064
0065
0066 inet_sk(sk)->mc_loop = 0;
0067
0068
0069 inet_inc_convert_csum(sk);
0070
0071 rcu_assign_sk_user_data(sk, cfg->sk_user_data);
0072
0073 udp_sk(sk)->encap_type = cfg->encap_type;
0074 udp_sk(sk)->encap_rcv = cfg->encap_rcv;
0075 udp_sk(sk)->encap_err_rcv = cfg->encap_err_rcv;
0076 udp_sk(sk)->encap_err_lookup = cfg->encap_err_lookup;
0077 udp_sk(sk)->encap_destroy = cfg->encap_destroy;
0078 udp_sk(sk)->gro_receive = cfg->gro_receive;
0079 udp_sk(sk)->gro_complete = cfg->gro_complete;
0080
0081 udp_tunnel_encap_enable(sock);
0082 }
0083 EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
0084
0085 void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock,
0086 unsigned short type)
0087 {
0088 struct sock *sk = sock->sk;
0089 struct udp_tunnel_info ti;
0090
0091 ti.type = type;
0092 ti.sa_family = sk->sk_family;
0093 ti.port = inet_sk(sk)->inet_sport;
0094
0095 udp_tunnel_nic_add_port(dev, &ti);
0096 }
0097 EXPORT_SYMBOL_GPL(udp_tunnel_push_rx_port);
0098
0099 void udp_tunnel_drop_rx_port(struct net_device *dev, struct socket *sock,
0100 unsigned short type)
0101 {
0102 struct sock *sk = sock->sk;
0103 struct udp_tunnel_info ti;
0104
0105 ti.type = type;
0106 ti.sa_family = sk->sk_family;
0107 ti.port = inet_sk(sk)->inet_sport;
0108
0109 udp_tunnel_nic_del_port(dev, &ti);
0110 }
0111 EXPORT_SYMBOL_GPL(udp_tunnel_drop_rx_port);
0112
0113
0114 void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type)
0115 {
0116 struct sock *sk = sock->sk;
0117 struct net *net = sock_net(sk);
0118 struct udp_tunnel_info ti;
0119 struct net_device *dev;
0120
0121 ti.type = type;
0122 ti.sa_family = sk->sk_family;
0123 ti.port = inet_sk(sk)->inet_sport;
0124
0125 rcu_read_lock();
0126 for_each_netdev_rcu(net, dev) {
0127 udp_tunnel_nic_add_port(dev, &ti);
0128 }
0129 rcu_read_unlock();
0130 }
0131 EXPORT_SYMBOL_GPL(udp_tunnel_notify_add_rx_port);
0132
0133
0134 void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type)
0135 {
0136 struct sock *sk = sock->sk;
0137 struct net *net = sock_net(sk);
0138 struct udp_tunnel_info ti;
0139 struct net_device *dev;
0140
0141 ti.type = type;
0142 ti.sa_family = sk->sk_family;
0143 ti.port = inet_sk(sk)->inet_sport;
0144
0145 rcu_read_lock();
0146 for_each_netdev_rcu(net, dev) {
0147 udp_tunnel_nic_del_port(dev, &ti);
0148 }
0149 rcu_read_unlock();
0150 }
0151 EXPORT_SYMBOL_GPL(udp_tunnel_notify_del_rx_port);
0152
0153 void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
0154 __be32 src, __be32 dst, __u8 tos, __u8 ttl,
0155 __be16 df, __be16 src_port, __be16 dst_port,
0156 bool xnet, bool nocheck)
0157 {
0158 struct udphdr *uh;
0159
0160 __skb_push(skb, sizeof(*uh));
0161 skb_reset_transport_header(skb);
0162 uh = udp_hdr(skb);
0163
0164 uh->dest = dst_port;
0165 uh->source = src_port;
0166 uh->len = htons(skb->len);
0167
0168 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
0169
0170 udp_set_csum(nocheck, skb, src, dst, skb->len);
0171
0172 iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, xnet);
0173 }
0174 EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb);
0175
0176 void udp_tunnel_sock_release(struct socket *sock)
0177 {
0178 rcu_assign_sk_user_data(sock->sk, NULL);
0179 kernel_sock_shutdown(sock, SHUT_RDWR);
0180 sock_release(sock);
0181 }
0182 EXPORT_SYMBOL_GPL(udp_tunnel_sock_release);
0183
0184 struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short family,
0185 __be16 flags, __be64 tunnel_id, int md_size)
0186 {
0187 struct metadata_dst *tun_dst;
0188 struct ip_tunnel_info *info;
0189
0190 if (family == AF_INET)
0191 tun_dst = ip_tun_rx_dst(skb, flags, tunnel_id, md_size);
0192 else
0193 tun_dst = ipv6_tun_rx_dst(skb, flags, tunnel_id, md_size);
0194 if (!tun_dst)
0195 return NULL;
0196
0197 info = &tun_dst->u.tun_info;
0198 info->key.tp_src = udp_hdr(skb)->source;
0199 info->key.tp_dst = udp_hdr(skb)->dest;
0200 if (udp_hdr(skb)->check)
0201 info->key.tun_flags |= TUNNEL_CSUM;
0202 return tun_dst;
0203 }
0204 EXPORT_SYMBOL_GPL(udp_tun_rx_dst);
0205
0206 MODULE_LICENSE("GPL");