]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sys/compat/linux/linux_socket.c
MFC r283488:
[FreeBSD/stable/10.git] / sys / compat / linux / linux_socket.c
1 /*-
2  * Copyright (c) 1995 Søren Schmidt
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer
10  *    in this position and unchanged.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31
32 /* XXX we use functions that might not exist. */
33 #include "opt_compat.h"
34 #include "opt_inet6.h"
35
36 #include <sys/param.h>
37 #include <sys/proc.h>
38 #include <sys/systm.h>
39 #include <sys/sysproto.h>
40 #include <sys/capsicum.h>
41 #include <sys/fcntl.h>
42 #include <sys/file.h>
43 #include <sys/limits.h>
44 #include <sys/lock.h>
45 #include <sys/malloc.h>
46 #include <sys/mutex.h>
47 #include <sys/mbuf.h>
48 #include <sys/socket.h>
49 #include <sys/socketvar.h>
50 #include <sys/syscallsubr.h>
51 #include <sys/uio.h>
52 #include <sys/syslog.h>
53 #include <sys/un.h>
54
55 #include <net/if.h>
56 #include <netinet/in.h>
57 #include <netinet/in_systm.h>
58 #include <netinet/ip.h>
59 #include <netinet/tcp.h>
60 #ifdef INET6
61 #include <netinet/ip6.h>
62 #include <netinet6/ip6_var.h>
63 #include <netinet6/in6_var.h>
64 #endif
65
66 #ifdef COMPAT_LINUX32
67 #include <machine/../linux32/linux.h>
68 #include <machine/../linux32/linux32_proto.h>
69 #else
70 #include <machine/../linux/linux.h>
71 #include <machine/../linux/linux_proto.h>
72 #endif
73 #include <compat/linux/linux_file.h>
74 #include <compat/linux/linux_socket.h>
75 #include <compat/linux/linux_timer.h>
76 #include <compat/linux/linux_util.h>
77
78 static int linux_to_bsd_domain(int);
79 static int linux_sendmsg_common(struct thread *, l_int, struct l_msghdr *,
80                                         l_uint);
81 static int linux_recvmsg_common(struct thread *, l_int, struct l_msghdr *,
82                                         l_uint, struct msghdr *);
83
84 /*
85  * Reads a linux sockaddr and does any necessary translation.
86  * Linux sockaddrs don't have a length field, only a family.
87  * Copy the osockaddr structure pointed to by osa to kernel, adjust
88  * family and convert to sockaddr.
89  */
90 static int
91 linux_getsockaddr(struct sockaddr **sap, const struct osockaddr *osa, int salen)
92 {
93         struct sockaddr *sa;
94         struct osockaddr *kosa;
95 #ifdef INET6
96         struct sockaddr_in6 *sin6;
97         int oldv6size;
98 #endif
99         char *name;
100         int bdom, error, hdrlen, namelen;
101
102         if (salen < 2 || salen > UCHAR_MAX || !osa)
103                 return (EINVAL);
104
105 #ifdef INET6
106         oldv6size = 0;
107         /*
108          * Check for old (pre-RFC2553) sockaddr_in6. We may accept it
109          * if it's a v4-mapped address, so reserve the proper space
110          * for it.
111          */
112         if (salen == sizeof(struct sockaddr_in6) - sizeof(uint32_t)) {
113                 salen += sizeof(uint32_t);
114                 oldv6size = 1;
115         }
116 #endif
117
118         kosa = malloc(salen, M_SONAME, M_WAITOK);
119
120         if ((error = copyin(osa, kosa, salen)))
121                 goto out;
122
123         bdom = linux_to_bsd_domain(kosa->sa_family);
124         if (bdom == -1) {
125                 error = EAFNOSUPPORT;
126                 goto out;
127         }
128
129 #ifdef INET6
130         /*
131          * Older Linux IPv6 code uses obsolete RFC2133 struct sockaddr_in6,
132          * which lacks the scope id compared with RFC2553 one. If we detect
133          * the situation, reject the address and write a message to system log.
134          *
135          * Still accept addresses for which the scope id is not used.
136          */
137         if (oldv6size) {
138                 if (bdom == AF_INET6) {
139                         sin6 = (struct sockaddr_in6 *)kosa;
140                         if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr) ||
141                             (!IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) &&
142                              !IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr) &&
143                              !IN6_IS_ADDR_V4COMPAT(&sin6->sin6_addr) &&
144                              !IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) &&
145                              !IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))) {
146                                 sin6->sin6_scope_id = 0;
147                         } else {
148                                 log(LOG_DEBUG,
149                                     "obsolete pre-RFC2553 sockaddr_in6 rejected\n");
150                                 error = EINVAL;
151                                 goto out;
152                         }
153                 } else
154                         salen -= sizeof(uint32_t);
155         }
156 #endif
157         if (bdom == AF_INET) {
158                 if (salen < sizeof(struct sockaddr_in)) {
159                         error = EINVAL;
160                         goto out;
161                 }
162                 salen = sizeof(struct sockaddr_in);
163         }
164
165         if (bdom == AF_LOCAL && salen > sizeof(struct sockaddr_un)) {
166                 hdrlen = offsetof(struct sockaddr_un, sun_path);
167                 name = ((struct sockaddr_un *)kosa)->sun_path;
168                 if (*name == '\0') {
169                         /*
170                          * Linux abstract namespace starts with a NULL byte.
171                          * XXX We do not support abstract namespace yet.
172                          */
173                         namelen = strnlen(name + 1, salen - hdrlen - 1) + 1;
174                 } else
175                         namelen = strnlen(name, salen - hdrlen);
176                 salen = hdrlen + namelen;
177                 if (salen > sizeof(struct sockaddr_un)) {
178                         error = ENAMETOOLONG;
179                         goto out;
180                 }
181         }
182
183         sa = (struct sockaddr *)kosa;
184         sa->sa_family = bdom;
185         sa->sa_len = salen;
186
187         *sap = sa;
188         return (0);
189
190 out:
191         free(kosa, M_SONAME);
192         return (error);
193 }
194
195 static int
196 linux_to_bsd_domain(int domain)
197 {
198
199         switch (domain) {
200         case LINUX_AF_UNSPEC:
201                 return (AF_UNSPEC);
202         case LINUX_AF_UNIX:
203                 return (AF_LOCAL);
204         case LINUX_AF_INET:
205                 return (AF_INET);
206         case LINUX_AF_INET6:
207                 return (AF_INET6);
208         case LINUX_AF_AX25:
209                 return (AF_CCITT);
210         case LINUX_AF_IPX:
211                 return (AF_IPX);
212         case LINUX_AF_APPLETALK:
213                 return (AF_APPLETALK);
214         }
215         return (-1);
216 }
217
218 static int
219 bsd_to_linux_domain(int domain)
220 {
221
222         switch (domain) {
223         case AF_UNSPEC:
224                 return (LINUX_AF_UNSPEC);
225         case AF_LOCAL:
226                 return (LINUX_AF_UNIX);
227         case AF_INET:
228                 return (LINUX_AF_INET);
229         case AF_INET6:
230                 return (LINUX_AF_INET6);
231         case AF_CCITT:
232                 return (LINUX_AF_AX25);
233         case AF_IPX:
234                 return (LINUX_AF_IPX);
235         case AF_APPLETALK:
236                 return (LINUX_AF_APPLETALK);
237         }
238         return (-1);
239 }
240
241 static int
242 linux_to_bsd_sockopt_level(int level)
243 {
244
245         switch (level) {
246         case LINUX_SOL_SOCKET:
247                 return (SOL_SOCKET);
248         }
249         return (level);
250 }
251
252 static int
253 bsd_to_linux_sockopt_level(int level)
254 {
255
256         switch (level) {
257         case SOL_SOCKET:
258                 return (LINUX_SOL_SOCKET);
259         }
260         return (level);
261 }
262
263 static int
264 linux_to_bsd_ip_sockopt(int opt)
265 {
266
267         switch (opt) {
268         case LINUX_IP_TOS:
269                 return (IP_TOS);
270         case LINUX_IP_TTL:
271                 return (IP_TTL);
272         case LINUX_IP_OPTIONS:
273                 return (IP_OPTIONS);
274         case LINUX_IP_MULTICAST_IF:
275                 return (IP_MULTICAST_IF);
276         case LINUX_IP_MULTICAST_TTL:
277                 return (IP_MULTICAST_TTL);
278         case LINUX_IP_MULTICAST_LOOP:
279                 return (IP_MULTICAST_LOOP);
280         case LINUX_IP_ADD_MEMBERSHIP:
281                 return (IP_ADD_MEMBERSHIP);
282         case LINUX_IP_DROP_MEMBERSHIP:
283                 return (IP_DROP_MEMBERSHIP);
284         case LINUX_IP_HDRINCL:
285                 return (IP_HDRINCL);
286         }
287         return (-1);
288 }
289
290 static int
291 linux_to_bsd_so_sockopt(int opt)
292 {
293
294         switch (opt) {
295         case LINUX_SO_DEBUG:
296                 return (SO_DEBUG);
297         case LINUX_SO_REUSEADDR:
298                 return (SO_REUSEADDR);
299         case LINUX_SO_TYPE:
300                 return (SO_TYPE);
301         case LINUX_SO_ERROR:
302                 return (SO_ERROR);
303         case LINUX_SO_DONTROUTE:
304                 return (SO_DONTROUTE);
305         case LINUX_SO_BROADCAST:
306                 return (SO_BROADCAST);
307         case LINUX_SO_SNDBUF:
308                 return (SO_SNDBUF);
309         case LINUX_SO_RCVBUF:
310                 return (SO_RCVBUF);
311         case LINUX_SO_KEEPALIVE:
312                 return (SO_KEEPALIVE);
313         case LINUX_SO_OOBINLINE:
314                 return (SO_OOBINLINE);
315         case LINUX_SO_LINGER:
316                 return (SO_LINGER);
317         case LINUX_SO_PEERCRED:
318                 return (LOCAL_PEERCRED);
319         case LINUX_SO_RCVLOWAT:
320                 return (SO_RCVLOWAT);
321         case LINUX_SO_SNDLOWAT:
322                 return (SO_SNDLOWAT);
323         case LINUX_SO_RCVTIMEO:
324                 return (SO_RCVTIMEO);
325         case LINUX_SO_SNDTIMEO:
326                 return (SO_SNDTIMEO);
327         case LINUX_SO_TIMESTAMP:
328                 return (SO_TIMESTAMP);
329         case LINUX_SO_ACCEPTCONN:
330                 return (SO_ACCEPTCONN);
331         }
332         return (-1);
333 }
334
335 static int
336 linux_to_bsd_tcp_sockopt(int opt)
337 {
338
339         switch (opt) {
340         case LINUX_TCP_NODELAY:
341                 return (TCP_NODELAY);
342         case LINUX_TCP_MAXSEG:
343                 return (TCP_MAXSEG);
344         case LINUX_TCP_KEEPIDLE:
345                 return (TCP_KEEPIDLE);
346         case LINUX_TCP_KEEPINTVL:
347                 return (TCP_KEEPINTVL);
348         case LINUX_TCP_KEEPCNT:
349                 return (TCP_KEEPCNT);
350         case LINUX_TCP_MD5SIG:
351                 return (TCP_MD5SIG);
352         }
353         return (-1);
354 }
355
356 static int
357 linux_to_bsd_msg_flags(int flags)
358 {
359         int ret_flags = 0;
360
361         if (flags & LINUX_MSG_OOB)
362                 ret_flags |= MSG_OOB;
363         if (flags & LINUX_MSG_PEEK)
364                 ret_flags |= MSG_PEEK;
365         if (flags & LINUX_MSG_DONTROUTE)
366                 ret_flags |= MSG_DONTROUTE;
367         if (flags & LINUX_MSG_CTRUNC)
368                 ret_flags |= MSG_CTRUNC;
369         if (flags & LINUX_MSG_TRUNC)
370                 ret_flags |= MSG_TRUNC;
371         if (flags & LINUX_MSG_DONTWAIT)
372                 ret_flags |= MSG_DONTWAIT;
373         if (flags & LINUX_MSG_EOR)
374                 ret_flags |= MSG_EOR;
375         if (flags & LINUX_MSG_WAITALL)
376                 ret_flags |= MSG_WAITALL;
377         if (flags & LINUX_MSG_NOSIGNAL)
378                 ret_flags |= MSG_NOSIGNAL;
379 #if 0 /* not handled */
380         if (flags & LINUX_MSG_PROXY)
381                 ;
382         if (flags & LINUX_MSG_FIN)
383                 ;
384         if (flags & LINUX_MSG_SYN)
385                 ;
386         if (flags & LINUX_MSG_CONFIRM)
387                 ;
388         if (flags & LINUX_MSG_RST)
389                 ;
390         if (flags & LINUX_MSG_ERRQUEUE)
391                 ;
392 #endif
393         return ret_flags;
394 }
395
396 /*
397 * If bsd_to_linux_sockaddr() or linux_to_bsd_sockaddr() faults, then the
398 * native syscall will fault.  Thus, we don't really need to check the
399 * return values for these functions.
400 */
401
402 static int
403 bsd_to_linux_sockaddr(struct sockaddr *arg)
404 {
405         struct sockaddr sa;
406         size_t sa_len = sizeof(struct sockaddr);
407         int error;
408         
409         if ((error = copyin(arg, &sa, sa_len)))
410                 return (error);
411         
412         *(u_short *)&sa = sa.sa_family;
413         
414         error = copyout(&sa, arg, sa_len);
415         
416         return (error);
417 }
418
419 static int
420 linux_to_bsd_sockaddr(struct sockaddr *arg, int len)
421 {
422         struct sockaddr sa;
423         size_t sa_len = sizeof(struct sockaddr);
424         int error;
425
426         if ((error = copyin(arg, &sa, sa_len)))
427                 return (error);
428
429         sa.sa_family = *(sa_family_t *)&sa;
430         sa.sa_len = len;
431
432         error = copyout(&sa, arg, sa_len);
433
434         return (error);
435 }
436
437 static int
438 linux_sa_put(struct osockaddr *osa)
439 {
440         struct osockaddr sa;
441         int error, bdom;
442
443         /*
444          * Only read/write the osockaddr family part, the rest is
445          * not changed.
446          */
447         error = copyin(osa, &sa, sizeof(sa.sa_family));
448         if (error)
449                 return (error);
450
451         bdom = bsd_to_linux_domain(sa.sa_family);
452         if (bdom == -1)
453                 return (EINVAL);
454
455         sa.sa_family = bdom;
456         error = copyout(&sa, osa, sizeof(sa.sa_family));
457         if (error)
458                 return (error);
459
460         return (0);
461 }
462
463 static int
464 linux_to_bsd_cmsg_type(int cmsg_type)
465 {
466
467         switch (cmsg_type) {
468         case LINUX_SCM_RIGHTS:
469                 return (SCM_RIGHTS);
470         case LINUX_SCM_CREDENTIALS:
471                 return (SCM_CREDS);
472         }
473         return (-1);
474 }
475
476 static int
477 bsd_to_linux_cmsg_type(int cmsg_type)
478 {
479
480         switch (cmsg_type) {
481         case SCM_RIGHTS:
482                 return (LINUX_SCM_RIGHTS);
483         case SCM_CREDS:
484                 return (LINUX_SCM_CREDENTIALS);
485         }
486         return (-1);
487 }
488
489 static int
490 linux_to_bsd_msghdr(struct msghdr *bhdr, const struct l_msghdr *lhdr)
491 {
492         if (lhdr->msg_controllen > INT_MAX)
493                 return (ENOBUFS);
494
495         bhdr->msg_name          = PTRIN(lhdr->msg_name);
496         bhdr->msg_namelen       = lhdr->msg_namelen;
497         bhdr->msg_iov           = PTRIN(lhdr->msg_iov);
498         bhdr->msg_iovlen        = lhdr->msg_iovlen;
499         bhdr->msg_control       = PTRIN(lhdr->msg_control);
500
501         /*
502          * msg_controllen is skipped since BSD and LINUX control messages
503          * are potentially different sizes (e.g. the cred structure used
504          * by SCM_CREDS is different between the two operating system).
505          *
506          * The caller can set it (if necessary) after converting all the
507          * control messages.
508          */
509
510         bhdr->msg_flags         = linux_to_bsd_msg_flags(lhdr->msg_flags);
511         return (0);
512 }
513
514 static int
515 bsd_to_linux_msghdr(const struct msghdr *bhdr, struct l_msghdr *lhdr)
516 {
517         lhdr->msg_name          = PTROUT(bhdr->msg_name);
518         lhdr->msg_namelen       = bhdr->msg_namelen;
519         lhdr->msg_iov           = PTROUT(bhdr->msg_iov);
520         lhdr->msg_iovlen        = bhdr->msg_iovlen;
521         lhdr->msg_control       = PTROUT(bhdr->msg_control);
522
523         /*
524          * msg_controllen is skipped since BSD and LINUX control messages
525          * are potentially different sizes (e.g. the cred structure used
526          * by SCM_CREDS is different between the two operating system).
527          *
528          * The caller can set it (if necessary) after converting all the
529          * control messages.
530          */
531
532         /* msg_flags skipped */
533         return (0);
534 }
535
536 static int
537 linux_set_socket_flags(struct thread *td, int s, int flags)
538 {
539         int error;
540
541         if (flags & LINUX_SOCK_NONBLOCK) {
542                 error = kern_fcntl(td, s, F_SETFL, O_NONBLOCK);
543                 if (error)
544                         return (error);
545         }
546         if (flags & LINUX_SOCK_CLOEXEC) {
547                 error = kern_fcntl(td, s, F_SETFD, FD_CLOEXEC);
548                 if (error)
549                         return (error);
550         }
551         return (0);
552 }
553
554 static int
555 linux_sendit(struct thread *td, int s, struct msghdr *mp, int flags,
556     struct mbuf *control, enum uio_seg segflg)
557 {
558         struct sockaddr *to;
559         int error;
560
561         if (mp->msg_name != NULL) {
562                 error = linux_getsockaddr(&to, mp->msg_name, mp->msg_namelen);
563                 if (error)
564                         return (error);
565                 mp->msg_name = to;
566         } else
567                 to = NULL;
568
569         error = kern_sendit(td, s, mp, linux_to_bsd_msg_flags(flags), control,
570             segflg);
571
572         if (to)
573                 free(to, M_SONAME);
574         return (error);
575 }
576
577 /* Return 0 if IP_HDRINCL is set for the given socket. */
578 static int
579 linux_check_hdrincl(struct thread *td, int s)
580 {
581         int error, optval;
582         socklen_t size_val;
583
584         size_val = sizeof(optval);
585         error = kern_getsockopt(td, s, IPPROTO_IP, IP_HDRINCL,
586             &optval, UIO_SYSSPACE, &size_val);
587         if (error)
588                 return (error);
589
590         return (optval == 0);
591 }
592
593 /*
594  * Updated sendto() when IP_HDRINCL is set:
595  * tweak endian-dependent fields in the IP packet.
596  */
597 static int
598 linux_sendto_hdrincl(struct thread *td, struct linux_sendto_args *linux_args)
599 {
600 /*
601  * linux_ip_copysize defines how many bytes we should copy
602  * from the beginning of the IP packet before we customize it for BSD.
603  * It should include all the fields we modify (ip_len and ip_off).
604  */
605 #define linux_ip_copysize       8
606
607         struct ip *packet;
608         struct msghdr msg;
609         struct iovec aiov[1];
610         int error;
611
612         /* Check that the packet isn't too big or too small. */
613         if (linux_args->len < linux_ip_copysize ||
614             linux_args->len > IP_MAXPACKET)
615                 return (EINVAL);
616
617         packet = (struct ip *)malloc(linux_args->len, M_LINUX, M_WAITOK);
618
619         /* Make kernel copy of the packet to be sent */
620         if ((error = copyin(PTRIN(linux_args->msg), packet,
621             linux_args->len)))
622                 goto goout;
623
624         /* Convert fields from Linux to BSD raw IP socket format */
625         packet->ip_len = linux_args->len;
626         packet->ip_off = ntohs(packet->ip_off);
627
628         /* Prepare the msghdr and iovec structures describing the new packet */
629         msg.msg_name = PTRIN(linux_args->to);
630         msg.msg_namelen = linux_args->tolen;
631         msg.msg_iov = aiov;
632         msg.msg_iovlen = 1;
633         msg.msg_control = NULL;
634         msg.msg_flags = 0;
635         aiov[0].iov_base = (char *)packet;
636         aiov[0].iov_len = linux_args->len;
637         error = linux_sendit(td, linux_args->s, &msg, linux_args->flags,
638             NULL, UIO_SYSSPACE);
639 goout:
640         free(packet, M_LINUX);
641         return (error);
642 }
643
644 int
645 linux_socket(struct thread *td, struct linux_socket_args *args)
646 {
647         struct socket_args /* {
648                 int domain;
649                 int type;
650                 int protocol;
651         } */ bsd_args;
652         int retval_socket, socket_flags;
653
654         bsd_args.protocol = args->protocol;
655         socket_flags = args->type & ~LINUX_SOCK_TYPE_MASK;
656         if (socket_flags & ~(LINUX_SOCK_CLOEXEC | LINUX_SOCK_NONBLOCK))
657                 return (EINVAL);
658         bsd_args.type = args->type & LINUX_SOCK_TYPE_MASK;
659         if (bsd_args.type < 0 || bsd_args.type > LINUX_SOCK_MAX)
660                 return (EINVAL);
661         bsd_args.domain = linux_to_bsd_domain(args->domain);
662         if (bsd_args.domain == -1)
663                 return (EAFNOSUPPORT);
664
665         retval_socket = sys_socket(td, &bsd_args);
666         if (retval_socket)
667                 return (retval_socket);
668
669         retval_socket = linux_set_socket_flags(td, td->td_retval[0],
670             socket_flags);
671         if (retval_socket) {
672                 (void)kern_close(td, td->td_retval[0]);
673                 goto out;
674         }
675
676         if (bsd_args.type == SOCK_RAW
677             && (bsd_args.protocol == IPPROTO_RAW || bsd_args.protocol == 0)
678             && bsd_args.domain == PF_INET) {
679                 /* It's a raw IP socket: set the IP_HDRINCL option. */
680                 int hdrincl;
681
682                 hdrincl = 1;
683                 /* We ignore any error returned by kern_setsockopt() */
684                 kern_setsockopt(td, td->td_retval[0], IPPROTO_IP, IP_HDRINCL,
685                     &hdrincl, UIO_SYSSPACE, sizeof(hdrincl));
686         }
687 #ifdef INET6
688         /*
689          * Linux AF_INET6 socket has IPV6_V6ONLY setsockopt set to 0 by default
690          * and some apps depend on this. So, set V6ONLY to 0 for Linux apps.
691          * For simplicity we do this unconditionally of the net.inet6.ip6.v6only
692          * sysctl value.
693          */
694         if (bsd_args.domain == PF_INET6) {
695                 int v6only;
696
697                 v6only = 0;
698                 /* We ignore any error returned by setsockopt() */
699                 kern_setsockopt(td, td->td_retval[0], IPPROTO_IPV6, IPV6_V6ONLY,
700                     &v6only, UIO_SYSSPACE, sizeof(v6only));
701         }
702 #endif
703
704 out:
705         return (retval_socket);
706 }
707
708 int
709 linux_bind(struct thread *td, struct linux_bind_args *args)
710 {
711         struct sockaddr *sa;
712         int error;
713
714         error = linux_getsockaddr(&sa, PTRIN(args->name),
715             args->namelen);
716         if (error)
717                 return (error);
718
719         error = kern_bind(td, args->s, sa);
720         free(sa, M_SONAME);
721         if (error == EADDRNOTAVAIL && args->namelen != sizeof(struct sockaddr_in))
722                 return (EINVAL);
723         return (error);
724 }
725
726 int
727 linux_connect(struct thread *td, struct linux_connect_args *args)
728 {
729         cap_rights_t rights;
730         struct socket *so;
731         struct sockaddr *sa;
732         u_int fflag;
733         int error;
734
735         error = linux_getsockaddr(&sa, (struct osockaddr *)PTRIN(args->name),
736             args->namelen);
737         if (error)
738                 return (error);
739
740         error = kern_connect(td, args->s, sa);
741         free(sa, M_SONAME);
742         if (error != EISCONN)
743                 return (error);
744
745         /*
746          * Linux doesn't return EISCONN the first time it occurs,
747          * when on a non-blocking socket. Instead it returns the
748          * error getsockopt(SOL_SOCKET, SO_ERROR) would return on BSD.
749          *
750          * XXXRW: Instead of using fgetsock(), check that it is a
751          * socket and use the file descriptor reference instead of
752          * creating a new one.
753          */
754         error = fgetsock(td, args->s, cap_rights_init(&rights, CAP_CONNECT),
755             &so, &fflag);
756         if (error == 0) {
757                 error = EISCONN;
758                 if (fflag & FNONBLOCK) {
759                         SOCK_LOCK(so);
760                         if (so->so_emuldata == 0)
761                                 error = so->so_error;
762                         so->so_emuldata = (void *)1;
763                         SOCK_UNLOCK(so);
764                 }
765                 fputsock(so);
766         }
767         return (error);
768 }
769
770 int
771 linux_listen(struct thread *td, struct linux_listen_args *args)
772 {
773         struct listen_args /* {
774                 int s;
775                 int backlog;
776         } */ bsd_args;
777
778         bsd_args.s = args->s;
779         bsd_args.backlog = args->backlog;
780         return (sys_listen(td, &bsd_args));
781 }
782
783 static int
784 linux_accept_common(struct thread *td, int s, l_uintptr_t addr,
785     l_uintptr_t namelen, int flags)
786 {
787         struct accept_args /* {
788                 int     s;
789                 struct sockaddr * __restrict name;
790                 socklen_t * __restrict anamelen;
791         } */ bsd_args;
792         int error;
793
794         if (flags & ~(LINUX_SOCK_CLOEXEC | LINUX_SOCK_NONBLOCK))
795                 return (EINVAL);
796
797         bsd_args.s = s;
798         /* XXX: */
799         bsd_args.name = (struct sockaddr * __restrict)PTRIN(addr);
800         bsd_args.anamelen = PTRIN(namelen);/* XXX */
801         error = sys_accept(td, &bsd_args);
802         bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.name);
803         if (error) {
804                 if (error == EFAULT && namelen != sizeof(struct sockaddr_in))
805                         return (EINVAL);
806                 return (error);
807         }
808
809         /*
810          * linux appears not to copy flags from the parent socket to the
811          * accepted one, so we must clear the flags in the new descriptor
812          * and apply the requested flags.
813          */
814         error = kern_fcntl(td, td->td_retval[0], F_SETFL, 0);
815         if (error)
816                 goto out;
817         error = linux_set_socket_flags(td, td->td_retval[0], flags);
818         if (error)
819                 goto out;
820         if (addr)
821                 error = linux_sa_put(PTRIN(addr));
822
823 out:
824         if (error) {
825                 (void)kern_close(td, td->td_retval[0]);
826                 td->td_retval[0] = 0;
827         }
828         return (error);
829 }
830
831 int
832 linux_accept(struct thread *td, struct linux_accept_args *args)
833 {
834
835         return (linux_accept_common(td, args->s, args->addr,
836             args->namelen, 0));
837 }
838
839 int
840 linux_accept4(struct thread *td, struct linux_accept4_args *args)
841 {
842
843         return (linux_accept_common(td, args->s, args->addr,
844             args->namelen, args->flags));
845 }
846
847 int
848 linux_getsockname(struct thread *td, struct linux_getsockname_args *args)
849 {
850         struct getsockname_args /* {
851                 int     fdes;
852                 struct sockaddr * __restrict asa;
853                 socklen_t * __restrict alen;
854         } */ bsd_args;
855         int error;
856
857         bsd_args.fdes = args->s;
858         /* XXX: */
859         bsd_args.asa = (struct sockaddr * __restrict)PTRIN(args->addr);
860         bsd_args.alen = PTRIN(args->namelen);   /* XXX */
861         error = sys_getsockname(td, &bsd_args);
862         bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.asa);
863         if (error)
864                 return (error);
865         error = linux_sa_put(PTRIN(args->addr));
866         if (error)
867                 return (error);
868         return (0);
869 }
870
871 int
872 linux_getpeername(struct thread *td, struct linux_getpeername_args *args)
873 {
874         struct getpeername_args /* {
875                 int fdes;
876                 caddr_t asa;
877                 int *alen;
878         } */ bsd_args;
879         int error;
880
881         bsd_args.fdes = args->s;
882         bsd_args.asa = (struct sockaddr *)PTRIN(args->addr);
883         bsd_args.alen = (socklen_t *)PTRIN(args->namelen);
884         error = sys_getpeername(td, &bsd_args);
885         bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.asa);
886         if (error)
887                 return (error);
888         error = linux_sa_put(PTRIN(args->addr));
889         if (error)
890                 return (error);
891         return (0);
892 }
893
894 int
895 linux_socketpair(struct thread *td, struct linux_socketpair_args *args)
896 {
897         struct socketpair_args /* {
898                 int domain;
899                 int type;
900                 int protocol;
901                 int *rsv;
902         } */ bsd_args;
903         int error, socket_flags;
904         int sv[2];
905
906         bsd_args.domain = linux_to_bsd_domain(args->domain);
907         if (bsd_args.domain != PF_LOCAL)
908                 return (EAFNOSUPPORT);
909
910         socket_flags = args->type & ~LINUX_SOCK_TYPE_MASK;
911         if (socket_flags & ~(LINUX_SOCK_CLOEXEC | LINUX_SOCK_NONBLOCK))
912                 return (EINVAL);
913         bsd_args.type = args->type & LINUX_SOCK_TYPE_MASK;
914         if (bsd_args.type < 0 || bsd_args.type > LINUX_SOCK_MAX)
915                 return (EINVAL);
916
917         if (args->protocol != 0 && args->protocol != PF_UNIX)
918
919                 /*
920                  * Use of PF_UNIX as protocol argument is not right,
921                  * but Linux does it.
922                  * Do not map PF_UNIX as its Linux value is identical
923                  * to FreeBSD one.
924                  */
925                 return (EPROTONOSUPPORT);
926         else
927                 bsd_args.protocol = 0;
928         bsd_args.rsv = (int *)PTRIN(args->rsv);
929         error = kern_socketpair(td, bsd_args.domain, bsd_args.type,
930             bsd_args.protocol, sv);
931         if (error)
932                 return (error);
933         error = linux_set_socket_flags(td, sv[0], socket_flags);
934         if (error)
935                 goto out;
936         error = linux_set_socket_flags(td, sv[1], socket_flags);
937         if (error)
938                 goto out;
939
940         error = copyout(sv, bsd_args.rsv, 2 * sizeof(int));
941
942 out:
943         if (error) {
944                 (void)kern_close(td, sv[0]);
945                 (void)kern_close(td, sv[1]);
946         }
947         return (error);
948 }
949
950 #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
951 struct linux_send_args {
952         int s;
953         l_uintptr_t msg;
954         int len;
955         int flags;
956 };
957
958 static int
959 linux_send(struct thread *td, struct linux_send_args *args)
960 {
961         struct sendto_args /* {
962                 int s;
963                 caddr_t buf;
964                 int len;
965                 int flags;
966                 caddr_t to;
967                 int tolen;
968         } */ bsd_args;
969
970         bsd_args.s = args->s;
971         bsd_args.buf = (caddr_t)PTRIN(args->msg);
972         bsd_args.len = args->len;
973         bsd_args.flags = args->flags;
974         bsd_args.to = NULL;
975         bsd_args.tolen = 0;
976         return sys_sendto(td, &bsd_args);
977 }
978
979 struct linux_recv_args {
980         int s;
981         l_uintptr_t msg;
982         int len;
983         int flags;
984 };
985
986 static int
987 linux_recv(struct thread *td, struct linux_recv_args *args)
988 {
989         struct recvfrom_args /* {
990                 int s;
991                 caddr_t buf;
992                 int len;
993                 int flags;
994                 struct sockaddr *from;
995                 socklen_t fromlenaddr;
996         } */ bsd_args;
997
998         bsd_args.s = args->s;
999         bsd_args.buf = (caddr_t)PTRIN(args->msg);
1000         bsd_args.len = args->len;
1001         bsd_args.flags = linux_to_bsd_msg_flags(args->flags);
1002         bsd_args.from = NULL;
1003         bsd_args.fromlenaddr = 0;
1004         return (sys_recvfrom(td, &bsd_args));
1005 }
1006 #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
1007
1008 int
1009 linux_sendto(struct thread *td, struct linux_sendto_args *args)
1010 {
1011         struct msghdr msg;
1012         struct iovec aiov;
1013         int error;
1014
1015         if (linux_check_hdrincl(td, args->s) == 0)
1016                 /* IP_HDRINCL set, tweak the packet before sending */
1017                 return (linux_sendto_hdrincl(td, args));
1018
1019         msg.msg_name = PTRIN(args->to);
1020         msg.msg_namelen = args->tolen;
1021         msg.msg_iov = &aiov;
1022         msg.msg_iovlen = 1;
1023         msg.msg_control = NULL;
1024         msg.msg_flags = 0;
1025         aiov.iov_base = PTRIN(args->msg);
1026         aiov.iov_len = args->len;
1027         error = linux_sendit(td, args->s, &msg, args->flags, NULL,
1028             UIO_USERSPACE);
1029         return (error);
1030 }
1031
1032 int
1033 linux_recvfrom(struct thread *td, struct linux_recvfrom_args *args)
1034 {
1035         struct msghdr msg;
1036         struct iovec aiov;
1037         int error;
1038
1039         if (PTRIN(args->fromlen) != NULL) {
1040                 error = copyin(PTRIN(args->fromlen), &msg.msg_namelen,
1041                     sizeof(msg.msg_namelen));
1042                 if (error != 0)
1043                         return (error);
1044
1045                 error = linux_to_bsd_sockaddr((struct sockaddr *)PTRIN(args->from),
1046                     msg.msg_namelen);
1047                 if (error != 0)
1048                         return (error);
1049         } else
1050                 msg.msg_namelen = 0;
1051
1052         msg.msg_name = (struct sockaddr * __restrict)PTRIN(args->from);
1053         msg.msg_iov = &aiov;
1054         msg.msg_iovlen = 1;
1055         aiov.iov_base = PTRIN(args->buf);
1056         aiov.iov_len = args->len;
1057         msg.msg_control = 0;
1058         msg.msg_flags = linux_to_bsd_msg_flags(args->flags);
1059
1060         error = kern_recvit(td, args->s, &msg, UIO_USERSPACE, NULL);
1061         if (error != 0)
1062                 return (error);
1063
1064         if (PTRIN(args->from) != NULL) {
1065                 error = bsd_to_linux_sockaddr((struct sockaddr *)
1066                     PTRIN(args->from));
1067                 if (error != 0)
1068                         return (error);
1069
1070                 error = linux_sa_put((struct osockaddr *)
1071                     PTRIN(args->from));
1072         }
1073
1074         if (PTRIN(args->fromlen) != NULL)
1075                 error = copyout(&msg.msg_namelen, PTRIN(args->fromlen),
1076                     sizeof(msg.msg_namelen));
1077
1078         return (error);
1079 }
1080
1081 static int
1082 linux_sendmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr,
1083     l_uint flags)
1084 {
1085         struct cmsghdr *cmsg;
1086         struct cmsgcred cmcred;
1087         struct mbuf *control;
1088         struct msghdr msg;
1089         struct l_cmsghdr linux_cmsg;
1090         struct l_cmsghdr *ptr_cmsg;
1091         struct l_msghdr linux_msg;
1092         struct iovec *iov;
1093         socklen_t datalen;
1094         struct sockaddr *sa;
1095         sa_family_t sa_family;
1096         void *data;
1097         int error;
1098
1099         error = copyin(msghdr, &linux_msg, sizeof(linux_msg));
1100         if (error != 0)
1101                 return (error);
1102
1103         /*
1104          * Some Linux applications (ping) define a non-NULL control data
1105          * pointer, but a msg_controllen of 0, which is not allowed in the
1106          * FreeBSD system call interface.  NULL the msg_control pointer in
1107          * order to handle this case.  This should be checked, but allows the
1108          * Linux ping to work.
1109          */
1110         if (PTRIN(linux_msg.msg_control) != NULL && linux_msg.msg_controllen == 0)
1111                 linux_msg.msg_control = PTROUT(NULL);
1112
1113         error = linux_to_bsd_msghdr(&msg, &linux_msg);
1114         if (error != 0)
1115                 return (error);
1116
1117 #ifdef COMPAT_LINUX32
1118         error = linux32_copyiniov(PTRIN(msg.msg_iov), msg.msg_iovlen,
1119             &iov, EMSGSIZE);
1120 #else
1121         error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
1122 #endif
1123         if (error != 0)
1124                 return (error);
1125
1126         control = NULL;
1127         cmsg = NULL;
1128
1129         if ((ptr_cmsg = LINUX_CMSG_FIRSTHDR(&linux_msg)) != NULL) {
1130                 error = kern_getsockname(td, s, &sa, &datalen);
1131                 if (error != 0)
1132                         goto bad;
1133                 sa_family = sa->sa_family;
1134                 free(sa, M_SONAME);
1135
1136                 error = ENOBUFS;
1137                 cmsg = malloc(CMSG_HDRSZ, M_LINUX, M_WAITOK|M_ZERO);
1138                 control = m_get(M_WAITOK, MT_CONTROL);
1139                 if (control == NULL)
1140                         goto bad;
1141
1142                 do {
1143                         error = copyin(ptr_cmsg, &linux_cmsg,
1144                             sizeof(struct l_cmsghdr));
1145                         if (error != 0)
1146                                 goto bad;
1147
1148                         error = EINVAL;
1149                         if (linux_cmsg.cmsg_len < sizeof(struct l_cmsghdr))
1150                                 goto bad;
1151
1152                         /*
1153                          * Now we support only SCM_RIGHTS and SCM_CRED,
1154                          * so return EINVAL in any other cmsg_type
1155                          */
1156                         cmsg->cmsg_type =
1157                             linux_to_bsd_cmsg_type(linux_cmsg.cmsg_type);
1158                         cmsg->cmsg_level =
1159                             linux_to_bsd_sockopt_level(linux_cmsg.cmsg_level);
1160                         if (cmsg->cmsg_type == -1
1161                             || cmsg->cmsg_level != SOL_SOCKET)
1162                                 goto bad;
1163
1164                         /*
1165                          * Some applications (e.g. pulseaudio) attempt to
1166                          * send ancillary data even if the underlying protocol
1167                          * doesn't support it which is not allowed in the
1168                          * FreeBSD system call interface.
1169                          */
1170                         if (sa_family != AF_UNIX)
1171                                 continue;
1172
1173                         data = LINUX_CMSG_DATA(ptr_cmsg);
1174                         datalen = linux_cmsg.cmsg_len - L_CMSG_HDRSZ;
1175
1176                         switch (cmsg->cmsg_type)
1177                         {
1178                         case SCM_RIGHTS:
1179                                 break;
1180
1181                         case SCM_CREDS:
1182                                 data = &cmcred;
1183                                 datalen = sizeof(cmcred);
1184
1185                                 /*
1186                                  * The lower levels will fill in the structure
1187                                  */
1188                                 bzero(data, datalen);
1189                                 break;
1190                         }
1191
1192                         cmsg->cmsg_len = CMSG_LEN(datalen);
1193
1194                         error = ENOBUFS;
1195                         if (!m_append(control, CMSG_HDRSZ, (c_caddr_t)cmsg))
1196                                 goto bad;
1197                         if (!m_append(control, datalen, (c_caddr_t)data))
1198                                 goto bad;
1199                 } while ((ptr_cmsg = LINUX_CMSG_NXTHDR(&linux_msg, ptr_cmsg)));
1200
1201                 if (m_length(control, NULL) == 0) {
1202                         m_freem(control);
1203                         control = NULL;
1204                 }
1205         }
1206
1207         msg.msg_iov = iov;
1208         msg.msg_flags = 0;
1209         error = linux_sendit(td, s, &msg, flags, control, UIO_USERSPACE);
1210
1211 bad:
1212         free(iov, M_IOV);
1213         if (cmsg)
1214                 free(cmsg, M_LINUX);
1215         return (error);
1216 }
1217
1218 int
1219 linux_sendmsg(struct thread *td, struct linux_sendmsg_args *args)
1220 {
1221
1222         return (linux_sendmsg_common(td, args->s, PTRIN(args->msg),
1223             args->flags));
1224 }
1225
1226 int
1227 linux_sendmmsg(struct thread *td, struct linux_sendmmsg_args *args)
1228 {
1229         struct l_mmsghdr *msg;
1230         l_uint retval;
1231         int error, datagrams;
1232
1233         if (args->vlen > UIO_MAXIOV)
1234                 args->vlen = UIO_MAXIOV;
1235
1236         msg = PTRIN(args->msg);
1237         datagrams = 0;
1238         while (datagrams < args->vlen) {
1239                 error = linux_sendmsg_common(td, args->s, &msg->msg_hdr,
1240                     args->flags);
1241                 if (error != 0)
1242                         break;
1243
1244                 retval = td->td_retval[0];
1245                 error = copyout(&retval, &msg->msg_len, sizeof(msg->msg_len));
1246                 if (error != 0)
1247                         break;
1248                 ++msg;
1249                 ++datagrams;
1250         }
1251         if (error == 0)
1252                 td->td_retval[0] = datagrams;
1253         return (error);
1254 }
1255
1256 static int
1257 linux_recvmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr,
1258     l_uint flags, struct msghdr *msg)
1259 {
1260         struct cmsghdr *cm;
1261         struct cmsgcred *cmcred;
1262         struct l_cmsghdr *linux_cmsg = NULL;
1263         struct l_ucred linux_ucred;
1264         socklen_t datalen, outlen;
1265         struct l_msghdr linux_msg;
1266         struct iovec *iov, *uiov;
1267         struct mbuf *control = NULL;
1268         struct mbuf **controlp;
1269         caddr_t outbuf;
1270         void *data;
1271         int error, i, fd, fds, *fdp;
1272
1273         error = copyin(msghdr, &linux_msg, sizeof(linux_msg));
1274         if (error != 0)
1275                 return (error);
1276
1277         error = linux_to_bsd_msghdr(msg, &linux_msg);
1278         if (error != 0)
1279                 return (error);
1280
1281 #ifdef COMPAT_LINUX32
1282         error = linux32_copyiniov(PTRIN(msg->msg_iov), msg->msg_iovlen,
1283             &iov, EMSGSIZE);
1284 #else
1285         error = copyiniov(msg->msg_iov, msg->msg_iovlen, &iov, EMSGSIZE);
1286 #endif
1287         if (error != 0)
1288                 return (error);
1289
1290         if (msg->msg_name) {
1291                 error = linux_to_bsd_sockaddr((struct sockaddr *)msg->msg_name,
1292                     msg->msg_namelen);
1293                 if (error != 0)
1294                         goto bad;
1295         }
1296
1297         uiov = msg->msg_iov;
1298         msg->msg_iov = iov;
1299         controlp = (msg->msg_control != NULL) ? &control : NULL;
1300         error = kern_recvit(td, s, msg, UIO_USERSPACE, controlp);
1301         msg->msg_iov = uiov;
1302         if (error != 0)
1303                 goto bad;
1304
1305         error = bsd_to_linux_msghdr(msg, &linux_msg);
1306         if (error != 0)
1307                 goto bad;
1308
1309         if (linux_msg.msg_name) {
1310                 error = bsd_to_linux_sockaddr((struct sockaddr *)
1311                     PTRIN(linux_msg.msg_name));
1312                 if (error != 0)
1313                         goto bad;
1314         }
1315         if (linux_msg.msg_name && linux_msg.msg_namelen > 2) {
1316                 error = linux_sa_put(PTRIN(linux_msg.msg_name));
1317                 if (error != 0)
1318                         goto bad;
1319         }
1320
1321         outbuf = PTRIN(linux_msg.msg_control);
1322         outlen = 0;
1323
1324         if (control) {
1325                 linux_cmsg = malloc(L_CMSG_HDRSZ, M_LINUX, M_WAITOK | M_ZERO);
1326
1327                 msg->msg_control = mtod(control, struct cmsghdr *);
1328                 msg->msg_controllen = control->m_len;
1329
1330                 cm = CMSG_FIRSTHDR(msg);
1331
1332                 while (cm != NULL) {
1333                         linux_cmsg->cmsg_type =
1334                             bsd_to_linux_cmsg_type(cm->cmsg_type);
1335                         linux_cmsg->cmsg_level =
1336                             bsd_to_linux_sockopt_level(cm->cmsg_level);
1337                         if (linux_cmsg->cmsg_type == -1
1338                             || cm->cmsg_level != SOL_SOCKET)
1339                         {
1340                                 error = EINVAL;
1341                                 goto bad;
1342                         }
1343
1344                         data = CMSG_DATA(cm);
1345                         datalen = (caddr_t)cm + cm->cmsg_len - (caddr_t)data;
1346
1347                         switch (cm->cmsg_type)
1348                         {
1349                         case SCM_RIGHTS:
1350                                 if (flags & LINUX_MSG_CMSG_CLOEXEC) {
1351                                         fds = datalen / sizeof(int);
1352                                         fdp = data;
1353                                         for (i = 0; i < fds; i++) {
1354                                                 fd = *fdp++;
1355                                                 (void)kern_fcntl(td, fd,
1356                                                     F_SETFD, FD_CLOEXEC);
1357                                         }
1358                                 }
1359                                 break;
1360
1361                         case SCM_CREDS:
1362                                 /*
1363                                  * Currently LOCAL_CREDS is never in
1364                                  * effect for Linux so no need to worry
1365                                  * about sockcred
1366                                  */
1367                                 if (datalen != sizeof(*cmcred)) {
1368                                         error = EMSGSIZE;
1369                                         goto bad;
1370                                 }
1371                                 cmcred = (struct cmsgcred *)data;
1372                                 bzero(&linux_ucred, sizeof(linux_ucred));
1373                                 linux_ucred.pid = cmcred->cmcred_pid;
1374                                 linux_ucred.uid = cmcred->cmcred_uid;
1375                                 linux_ucred.gid = cmcred->cmcred_gid;
1376                                 data = &linux_ucred;
1377                                 datalen = sizeof(linux_ucred);
1378                                 break;
1379                         }
1380
1381                         if (outlen + LINUX_CMSG_LEN(datalen) >
1382                             linux_msg.msg_controllen) {
1383                                 if (outlen == 0) {
1384                                         error = EMSGSIZE;
1385                                         goto bad;
1386                                 } else {
1387                                         linux_msg.msg_flags |=
1388                                             LINUX_MSG_CTRUNC;
1389                                         goto out;
1390                                 }
1391                         }
1392
1393                         linux_cmsg->cmsg_len = LINUX_CMSG_LEN(datalen);
1394
1395                         error = copyout(linux_cmsg, outbuf, L_CMSG_HDRSZ);
1396                         if (error)
1397                                 goto bad;
1398                         outbuf += L_CMSG_HDRSZ;
1399
1400                         error = copyout(data, outbuf, datalen);
1401                         if (error)
1402                                 goto bad;
1403
1404                         outbuf += LINUX_CMSG_ALIGN(datalen);
1405                         outlen += LINUX_CMSG_LEN(datalen);
1406
1407                         cm = CMSG_NXTHDR(msg, cm);
1408                 }
1409         }
1410
1411 out:
1412         linux_msg.msg_controllen = outlen;
1413         error = copyout(&linux_msg, msghdr, sizeof(linux_msg));
1414
1415 bad:
1416         free(iov, M_IOV);
1417         m_freem(control);
1418         free(linux_cmsg, M_LINUX);
1419
1420         return (error);
1421 }
1422
1423 int
1424 linux_recvmsg(struct thread *td, struct linux_recvmsg_args *args)
1425 {
1426         struct msghdr bsd_msg;
1427
1428         return (linux_recvmsg_common(td, args->s, PTRIN(args->msg),
1429             args->flags, &bsd_msg));
1430 }
1431
1432 int
1433 linux_recvmmsg(struct thread *td, struct linux_recvmmsg_args *args)
1434 {
1435         struct l_mmsghdr *msg;
1436         struct msghdr bsd_msg;
1437         struct l_timespec lts;
1438         struct timespec ts, tts;
1439         l_uint retval;
1440         int error, datagrams;
1441
1442         if (args->timeout) {
1443                 error = copyin(args->timeout, &lts, sizeof(struct l_timespec));
1444                 if (error != 0)
1445                         return (error);
1446                 error = linux_to_native_timespec(&ts, &lts);
1447                 if (error != 0)
1448                         return (error);
1449                 getnanotime(&tts);
1450                 timespecadd(&tts, &ts);
1451         }
1452
1453         msg = PTRIN(args->msg);
1454         datagrams = 0;
1455         while (datagrams < args->vlen) {
1456                 error = linux_recvmsg_common(td, args->s, &msg->msg_hdr,
1457                     args->flags & ~LINUX_MSG_WAITFORONE, &bsd_msg);
1458                 if (error != 0)
1459                         break;
1460
1461                 retval = td->td_retval[0];
1462                 error = copyout(&retval, &msg->msg_len, sizeof(msg->msg_len));
1463                 if (error != 0)
1464                         break;
1465                 ++msg;
1466                 ++datagrams;
1467
1468                 /*
1469                  * MSG_WAITFORONE turns on MSG_DONTWAIT after one packet.
1470                  */
1471                 if (args->flags & LINUX_MSG_WAITFORONE)
1472                         args->flags |= LINUX_MSG_DONTWAIT;
1473
1474                 /*
1475                  * See BUGS section of recvmmsg(2).
1476                  */
1477                 if (args->timeout) {
1478                         getnanotime(&ts);
1479                         timespecsub(&ts, &tts);
1480                         if (!timespecisset(&ts) || ts.tv_sec > 0)
1481                                 break;
1482                 }
1483                 /* Out of band data, return right away. */
1484                 if (bsd_msg.msg_flags & MSG_OOB)
1485                         break;
1486         }
1487         if (error == 0)
1488                 td->td_retval[0] = datagrams;
1489         return (error);
1490 }
1491
1492 int
1493 linux_shutdown(struct thread *td, struct linux_shutdown_args *args)
1494 {
1495         struct shutdown_args /* {
1496                 int s;
1497                 int how;
1498         } */ bsd_args;
1499
1500         bsd_args.s = args->s;
1501         bsd_args.how = args->how;
1502         return (sys_shutdown(td, &bsd_args));
1503 }
1504
1505 int
1506 linux_setsockopt(struct thread *td, struct linux_setsockopt_args *args)
1507 {
1508         struct setsockopt_args /* {
1509                 int s;
1510                 int level;
1511                 int name;
1512                 caddr_t val;
1513                 int valsize;
1514         } */ bsd_args;
1515         l_timeval linux_tv;
1516         struct timeval tv;
1517         int error, name;
1518
1519         bsd_args.s = args->s;
1520         bsd_args.level = linux_to_bsd_sockopt_level(args->level);
1521         switch (bsd_args.level) {
1522         case SOL_SOCKET:
1523                 name = linux_to_bsd_so_sockopt(args->optname);
1524                 switch (name) {
1525                 case SO_RCVTIMEO:
1526                         /* FALLTHROUGH */
1527                 case SO_SNDTIMEO:
1528                         error = copyin(PTRIN(args->optval), &linux_tv,
1529                             sizeof(linux_tv));
1530                         if (error)
1531                                 return (error);
1532                         tv.tv_sec = linux_tv.tv_sec;
1533                         tv.tv_usec = linux_tv.tv_usec;
1534                         return (kern_setsockopt(td, args->s, bsd_args.level,
1535                             name, &tv, UIO_SYSSPACE, sizeof(tv)));
1536                         /* NOTREACHED */
1537                         break;
1538                 default:
1539                         break;
1540                 }
1541                 break;
1542         case IPPROTO_IP:
1543                 name = linux_to_bsd_ip_sockopt(args->optname);
1544                 break;
1545         case IPPROTO_TCP:
1546                 name = linux_to_bsd_tcp_sockopt(args->optname);
1547                 break;
1548         default:
1549                 name = -1;
1550                 break;
1551         }
1552         if (name == -1)
1553                 return (ENOPROTOOPT);
1554
1555         bsd_args.name = name;
1556         bsd_args.val = PTRIN(args->optval);
1557         bsd_args.valsize = args->optlen;
1558
1559         if (name == IPV6_NEXTHOP) {
1560                 linux_to_bsd_sockaddr((struct sockaddr *)bsd_args.val,
1561                         bsd_args.valsize);
1562                 error = sys_setsockopt(td, &bsd_args);
1563                 bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.val);
1564         } else
1565                 error = sys_setsockopt(td, &bsd_args);
1566
1567         return (error);
1568 }
1569
1570 int
1571 linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args)
1572 {
1573         struct getsockopt_args /* {
1574                 int s;
1575                 int level;
1576                 int name;
1577                 caddr_t val;
1578                 int *avalsize;
1579         } */ bsd_args;
1580         l_timeval linux_tv;
1581         struct timeval tv;
1582         socklen_t tv_len, xulen;
1583         struct xucred xu;
1584         struct l_ucred lxu;
1585         int error, name;
1586
1587         bsd_args.s = args->s;
1588         bsd_args.level = linux_to_bsd_sockopt_level(args->level);
1589         switch (bsd_args.level) {
1590         case SOL_SOCKET:
1591                 name = linux_to_bsd_so_sockopt(args->optname);
1592                 switch (name) {
1593                 case SO_RCVTIMEO:
1594                         /* FALLTHROUGH */
1595                 case SO_SNDTIMEO:
1596                         tv_len = sizeof(tv);
1597                         error = kern_getsockopt(td, args->s, bsd_args.level,
1598                             name, &tv, UIO_SYSSPACE, &tv_len);
1599                         if (error)
1600                                 return (error);
1601                         linux_tv.tv_sec = tv.tv_sec;
1602                         linux_tv.tv_usec = tv.tv_usec;
1603                         return (copyout(&linux_tv, PTRIN(args->optval),
1604                             sizeof(linux_tv)));
1605                         /* NOTREACHED */
1606                         break;
1607                 case LOCAL_PEERCRED:
1608                         if (args->optlen != sizeof(lxu))
1609                                 return (EINVAL);
1610                         xulen = sizeof(xu);
1611                         error = kern_getsockopt(td, args->s, bsd_args.level,
1612                             name, &xu, UIO_SYSSPACE, &xulen);
1613                         if (error)
1614                                 return (error);
1615                         /*
1616                          * XXX Use 0 for pid as the FreeBSD does not cache peer pid.
1617                          */
1618                         lxu.pid = 0;
1619                         lxu.uid = xu.cr_uid;
1620                         lxu.gid = xu.cr_gid;
1621                         return (copyout(&lxu, PTRIN(args->optval), sizeof(lxu)));
1622                         /* NOTREACHED */
1623                         break;
1624                 default:
1625                         break;
1626                 }
1627                 break;
1628         case IPPROTO_IP:
1629                 name = linux_to_bsd_ip_sockopt(args->optname);
1630                 break;
1631         case IPPROTO_TCP:
1632                 name = linux_to_bsd_tcp_sockopt(args->optname);
1633                 break;
1634         default:
1635                 name = -1;
1636                 break;
1637         }
1638         if (name == -1)
1639                 return (EINVAL);
1640
1641         bsd_args.name = name;
1642         bsd_args.val = PTRIN(args->optval);
1643         bsd_args.avalsize = PTRIN(args->optlen);
1644
1645         if (name == IPV6_NEXTHOP) {
1646                 error = sys_getsockopt(td, &bsd_args);
1647                 bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.val);
1648         } else
1649                 error = sys_getsockopt(td, &bsd_args);
1650
1651         return (error);
1652 }
1653
1654 #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
1655
1656 /* Argument list sizes for linux_socketcall */
1657
1658 #define LINUX_AL(x) ((x) * sizeof(l_ulong))
1659
1660 static const unsigned char lxs_args[] = {
1661         LINUX_AL(0) /* unused*/,        LINUX_AL(3) /* socket */,
1662         LINUX_AL(3) /* bind */,         LINUX_AL(3) /* connect */,
1663         LINUX_AL(2) /* listen */,       LINUX_AL(3) /* accept */,
1664         LINUX_AL(3) /* getsockname */,  LINUX_AL(3) /* getpeername */,
1665         LINUX_AL(4) /* socketpair */,   LINUX_AL(4) /* send */,
1666         LINUX_AL(4) /* recv */,         LINUX_AL(6) /* sendto */,
1667         LINUX_AL(6) /* recvfrom */,     LINUX_AL(2) /* shutdown */,
1668         LINUX_AL(5) /* setsockopt */,   LINUX_AL(5) /* getsockopt */,
1669         LINUX_AL(3) /* sendmsg */,      LINUX_AL(3) /* recvmsg */,
1670         LINUX_AL(4) /* accept4 */,      LINUX_AL(5) /* recvmmsg */,
1671         LINUX_AL(4) /* sendmmsg */
1672 };
1673
1674 #define LINUX_AL_SIZE   sizeof(lxs_args) / sizeof(lxs_args[0]) - 1
1675
1676 int
1677 linux_socketcall(struct thread *td, struct linux_socketcall_args *args)
1678 {
1679         l_ulong a[6];
1680         void *arg;
1681         int error;
1682
1683         if (args->what < LINUX_SOCKET || args->what > LINUX_AL_SIZE)
1684                 return (EINVAL);
1685         error = copyin(PTRIN(args->args), a, lxs_args[args->what]);
1686         if (error)
1687                 return (error);
1688
1689         arg = a;
1690         switch (args->what) {
1691         case LINUX_SOCKET:
1692                 return (linux_socket(td, arg));
1693         case LINUX_BIND:
1694                 return (linux_bind(td, arg));
1695         case LINUX_CONNECT:
1696                 return (linux_connect(td, arg));
1697         case LINUX_LISTEN:
1698                 return (linux_listen(td, arg));
1699         case LINUX_ACCEPT:
1700                 return (linux_accept(td, arg));
1701         case LINUX_GETSOCKNAME:
1702                 return (linux_getsockname(td, arg));
1703         case LINUX_GETPEERNAME:
1704                 return (linux_getpeername(td, arg));
1705         case LINUX_SOCKETPAIR:
1706                 return (linux_socketpair(td, arg));
1707         case LINUX_SEND:
1708                 return (linux_send(td, arg));
1709         case LINUX_RECV:
1710                 return (linux_recv(td, arg));
1711         case LINUX_SENDTO:
1712                 return (linux_sendto(td, arg));
1713         case LINUX_RECVFROM:
1714                 return (linux_recvfrom(td, arg));
1715         case LINUX_SHUTDOWN:
1716                 return (linux_shutdown(td, arg));
1717         case LINUX_SETSOCKOPT:
1718                 return (linux_setsockopt(td, arg));
1719         case LINUX_GETSOCKOPT:
1720                 return (linux_getsockopt(td, arg));
1721         case LINUX_SENDMSG:
1722                 return (linux_sendmsg(td, arg));
1723         case LINUX_RECVMSG:
1724                 return (linux_recvmsg(td, arg));
1725         case LINUX_ACCEPT4:
1726                 return (linux_accept4(td, arg));
1727         case LINUX_RECVMMSG:
1728                 return (linux_recvmmsg(td, arg));
1729         case LINUX_SENDMMSG:
1730                 return (linux_sendmmsg(td, arg));
1731         }
1732
1733         uprintf("LINUX: 'socket' typ=%d not implemented\n", args->what);
1734         return (ENOSYS);
1735 }
1736 #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */