88#include <net/udp_tunnel.h>
99#include <net/net_namespace.h>
1010
11- int udp_sock_create (struct net * net , struct udp_port_cfg * cfg ,
12- struct socket * * sockp )
11+ int udp_sock_create4 (struct net * net , struct udp_port_cfg * cfg ,
12+ struct socket * * sockp )
1313{
1414 int err = - EINVAL ;
1515 struct socket * sock = NULL ;
16+ struct sockaddr_in udp_addr ;
1617
17- #if IS_ENABLED ( CONFIG_IPV6 )
18- if (cfg -> family == AF_INET6 ) {
19- struct sockaddr_in6 udp6_addr ;
18+ err = sock_create_kern ( AF_INET , SOCK_DGRAM , 0 , & sock );
19+ if (err < 0 )
20+ goto error ;
2021
21- err = sock_create_kern (AF_INET6 , SOCK_DGRAM , 0 , & sock );
22- if (err < 0 )
23- goto error ;
24-
25- sk_change_net (sock -> sk , net );
26-
27- udp6_addr .sin6_family = AF_INET6 ;
28- memcpy (& udp6_addr .sin6_addr , & cfg -> local_ip6 ,
29- sizeof (udp6_addr .sin6_addr ));
30- udp6_addr .sin6_port = cfg -> local_udp_port ;
31- err = kernel_bind (sock , (struct sockaddr * )& udp6_addr ,
32- sizeof (udp6_addr ));
33- if (err < 0 )
34- goto error ;
35-
36- if (cfg -> peer_udp_port ) {
37- udp6_addr .sin6_family = AF_INET6 ;
38- memcpy (& udp6_addr .sin6_addr , & cfg -> peer_ip6 ,
39- sizeof (udp6_addr .sin6_addr ));
40- udp6_addr .sin6_port = cfg -> peer_udp_port ;
41- err = kernel_connect (sock ,
42- (struct sockaddr * )& udp6_addr ,
43- sizeof (udp6_addr ), 0 );
44- }
45- if (err < 0 )
46- goto error ;
47-
48- udp_set_no_check6_tx (sock -> sk , !cfg -> use_udp6_tx_checksums );
49- udp_set_no_check6_rx (sock -> sk , !cfg -> use_udp6_rx_checksums );
50- } else
51- #endif
52- if (cfg -> family == AF_INET ) {
53- struct sockaddr_in udp_addr ;
54-
55- err = sock_create_kern (AF_INET , SOCK_DGRAM , 0 , & sock );
56- if (err < 0 )
57- goto error ;
22+ sk_change_net (sock -> sk , net );
5823
59- sk_change_net (sock -> sk , net );
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 ;
6031
32+ if (cfg -> peer_udp_port ) {
6133 udp_addr .sin_family = AF_INET ;
62- udp_addr .sin_addr = cfg -> local_ip ;
63- udp_addr .sin_port = cfg -> local_udp_port ;
64- err = kernel_bind (sock , (struct sockaddr * )& udp_addr ,
65- sizeof (udp_addr ));
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 );
6638 if (err < 0 )
6739 goto error ;
68-
69- if (cfg -> peer_udp_port ) {
70- udp_addr .sin_family = AF_INET ;
71- udp_addr .sin_addr = cfg -> peer_ip ;
72- udp_addr .sin_port = cfg -> peer_udp_port ;
73- err = kernel_connect (sock ,
74- (struct sockaddr * )& udp_addr ,
75- sizeof (udp_addr ), 0 );
76- if (err < 0 )
77- goto error ;
78- }
79-
80- sock -> sk -> sk_no_check_tx = !cfg -> use_udp_checksums ;
81- } else {
82- return - EPFNOSUPPORT ;
8340 }
8441
42+ sock -> sk -> sk_no_check_tx = !cfg -> use_udp_checksums ;
8543
8644 * sockp = sock ;
87-
8845 return 0 ;
8946
9047error :
@@ -95,6 +52,6 @@ int udp_sock_create(struct net *net, struct udp_port_cfg *cfg,
9552 * sockp = NULL ;
9653 return err ;
9754}
98- EXPORT_SYMBOL (udp_sock_create );
55+ EXPORT_SYMBOL (udp_sock_create4 );
9956
10057MODULE_LICENSE ("GPL" );
0 commit comments