udp_tunnel: Seperate ipv6 functions into its own file.
[deliverable/linux.git] / net / ipv4 / udp_tunnel.c
CommitLineData
8024e028
TH
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
fd384412
AZ
11int udp_sock_create4(struct net *net, struct udp_port_cfg *cfg,
12 struct socket **sockp)
8024e028
TH
13{
14 int err = -EINVAL;
15 struct socket *sock = NULL;
fd384412 16 struct sockaddr_in udp_addr;
8024e028 17
fd384412
AZ
18 err = sock_create_kern(AF_INET, SOCK_DGRAM, 0, &sock);
19 if (err < 0)
20 goto error;
8024e028 21
fd384412 22 sk_change_net(sock->sk, net);
8024e028 23
fd384412
AZ
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;
8024e028 31
fd384412 32 if (cfg->peer_udp_port) {
8024e028 33 udp_addr.sin_family = AF_INET;
fd384412
AZ
34 udp_addr.sin_addr = cfg->peer_ip;
35 udp_addr.sin_port = cfg->peer_udp_port;
36 err = kernel_connect(sock, (struct sockaddr *)&udp_addr,
37 sizeof(udp_addr), 0);
8024e028
TH
38 if (err < 0)
39 goto error;
8024e028
TH
40 }
41
fd384412 42 sock->sk->sk_no_check_tx = !cfg->use_udp_checksums;
8024e028
TH
43
44 *sockp = sock;
8024e028
TH
45 return 0;
46
47error:
48 if (sock) {
49 kernel_sock_shutdown(sock, SHUT_RDWR);
50 sk_release_kernel(sock->sk);
51 }
52 *sockp = NULL;
53 return err;
54}
fd384412 55EXPORT_SYMBOL(udp_sock_create4);
8024e028
TH
56
57MODULE_LICENSE("GPL");
This page took 0.040108 seconds and 5 git commands to generate.