Source file src/syscall/net_nacl.go
1
2
3
4
5
6
7
8
9
10
11 package syscall
12
13 import (
14 "sync"
15 "sync/atomic"
16 )
17
18
19
20
21
22 type runtimeTimer struct {
23 tb uintptr
24 i int
25
26 when int64
27 period int64
28 f func(interface{}, uintptr)
29 arg interface{}
30 seq uintptr
31 }
32
33 func startTimer(*runtimeTimer)
34 func stopTimer(*runtimeTimer) bool
35
36 type timer struct {
37 expired bool
38 q *queue
39 r runtimeTimer
40 }
41
42 func (t *timer) start(q *queue, deadline int64) {
43 if deadline == 0 {
44 return
45 }
46 t.q = q
47 t.r.when = deadline
48 t.r.f = timerExpired
49 t.r.arg = t
50 startTimer(&t.r)
51 }
52
53 func (t *timer) stop() {
54 if t.r.f == nil {
55 return
56 }
57 stopTimer(&t.r)
58 }
59
60 func (t *timer) reset(q *queue, deadline int64) {
61 t.stop()
62 if deadline == 0 {
63 return
64 }
65 if t.r.f == nil {
66 t.q = q
67 t.r.f = timerExpired
68 t.r.arg = t
69 }
70 t.r.when = deadline
71 startTimer(&t.r)
72 }
73
74 func timerExpired(i interface{}, seq uintptr) {
75 t := i.(*timer)
76 go func() {
77 t.q.Lock()
78 defer t.q.Unlock()
79 t.expired = true
80 t.q.canRead.Broadcast()
81 t.q.canWrite.Broadcast()
82 }()
83 }
84
85
86
87 const (
88 AF_UNSPEC = iota
89 AF_UNIX
90 AF_INET
91 AF_INET6
92 )
93
94 const (
95 SHUT_RD = iota
96 SHUT_WR
97 SHUT_RDWR
98 )
99
100 const (
101 SOCK_STREAM = 1 + iota
102 SOCK_DGRAM
103 SOCK_RAW
104 SOCK_SEQPACKET
105 )
106
107 const (
108 IPPROTO_IP = 0
109 IPPROTO_IPV4 = 4
110 IPPROTO_IPV6 = 0x29
111 IPPROTO_TCP = 6
112 IPPROTO_UDP = 0x11
113 )
114
115
116 const (
117 _ = iota
118 SOL_SOCKET
119 SO_TYPE
120 NET_RT_IFLIST
121 IFNAMSIZ
122 IFF_UP
123 IFF_BROADCAST
124 IFF_LOOPBACK
125 IFF_POINTOPOINT
126 IFF_MULTICAST
127 IPV6_V6ONLY
128 SOMAXCONN
129 F_DUPFD_CLOEXEC
130 SO_BROADCAST
131 SO_REUSEADDR
132 SO_REUSEPORT
133 SO_RCVBUF
134 SO_SNDBUF
135 SO_KEEPALIVE
136 SO_LINGER
137 SO_ERROR
138 IP_PORTRANGE
139 IP_PORTRANGE_DEFAULT
140 IP_PORTRANGE_LOW
141 IP_PORTRANGE_HIGH
142 IP_MULTICAST_IF
143 IP_MULTICAST_LOOP
144 IP_ADD_MEMBERSHIP
145 IPV6_PORTRANGE
146 IPV6_PORTRANGE_DEFAULT
147 IPV6_PORTRANGE_LOW
148 IPV6_PORTRANGE_HIGH
149 IPV6_MULTICAST_IF
150 IPV6_MULTICAST_LOOP
151 IPV6_JOIN_GROUP
152 TCP_NODELAY
153 TCP_KEEPINTVL
154 TCP_KEEPIDLE
155
156 SYS_FCNTL = 500
157 )
158
159 var SocketDisableIPv6 bool
160
161
162 type Sockaddr interface {
163
164 copy() Sockaddr
165
166
167
168 key() interface{}
169 }
170
171 type SockaddrInet4 struct {
172 Port int
173 Addr [4]byte
174 }
175
176 func (sa *SockaddrInet4) copy() Sockaddr {
177 sa1 := *sa
178 return &sa1
179 }
180
181 func (sa *SockaddrInet4) key() interface{} { return *sa }
182
183 func isIPv4Localhost(sa Sockaddr) bool {
184 sa4, ok := sa.(*SockaddrInet4)
185 return ok && sa4.Addr == [4]byte{127, 0, 0, 1}
186 }
187
188 type SockaddrInet6 struct {
189 Port int
190 ZoneId uint32
191 Addr [16]byte
192 }
193
194 func (sa *SockaddrInet6) copy() Sockaddr {
195 sa1 := *sa
196 return &sa1
197 }
198
199 func (sa *SockaddrInet6) key() interface{} { return *sa }
200
201 type SockaddrUnix struct {
202 Name string
203 }
204
205 func (sa *SockaddrUnix) copy() Sockaddr {
206 sa1 := *sa
207 return &sa1
208 }
209
210 func (sa *SockaddrUnix) key() interface{} { return *sa }
211
212 type SockaddrDatalink struct {
213 Len uint8
214 Family uint8
215 Index uint16
216 Type uint8
217 Nlen uint8
218 Alen uint8
219 Slen uint8
220 Data [12]int8
221 }
222
223 func (sa *SockaddrDatalink) copy() Sockaddr {
224 sa1 := *sa
225 return &sa1
226 }
227
228 func (sa *SockaddrDatalink) key() interface{} { return *sa }
229
230
231 type RoutingMessage interface {
232 unimplemented()
233 }
234
235 type IPMreq struct {
236 Multiaddr [4]byte
237 Interface [4]byte
238 }
239
240 type IPv6Mreq struct {
241 Multiaddr [16]byte
242 Interface uint32
243 }
244
245 type Linger struct {
246 Onoff int32
247 Linger int32
248 }
249
250 type ICMPv6Filter struct {
251 Filt [8]uint32
252 }
253
254
255
256
257
258 type queue struct {
259 sync.Mutex
260 canRead sync.Cond
261 canWrite sync.Cond
262 rtimer *timer
263 wtimer *timer
264 r int
265 w int
266 m int
267 closed bool
268 }
269
270 func (q *queue) init(size int) {
271 if size&(size-1) != 0 {
272 panic("invalid queue size - must be power of two")
273 }
274 q.canRead.L = &q.Mutex
275 q.canWrite.L = &q.Mutex
276 q.m = size - 1
277 }
278
279 func past(deadline int64) bool {
280 sec, nsec := now()
281 return deadline > 0 && deadline < sec*1e9+int64(nsec)
282 }
283
284 func (q *queue) waitRead(n int, deadline int64) (int, error) {
285 if past(deadline) {
286 return 0, EAGAIN
287 }
288 var t timer
289 t.start(q, deadline)
290 q.rtimer = &t
291 for q.w-q.r == 0 && !q.closed && !t.expired {
292 q.canRead.Wait()
293 }
294 q.rtimer = nil
295 t.stop()
296 m := q.w - q.r
297 if m == 0 && t.expired {
298 return 0, EAGAIN
299 }
300 if m > n {
301 m = n
302 q.canRead.Signal()
303 }
304 q.canWrite.Signal()
305 return m, nil
306 }
307
308 func (q *queue) waitWrite(n int, deadline int64) (int, error) {
309 if past(deadline) {
310 return 0, EAGAIN
311 }
312 var t timer
313 t.start(q, deadline)
314 q.wtimer = &t
315 for q.w-q.r > q.m && !q.closed && !t.expired {
316 q.canWrite.Wait()
317 }
318 q.wtimer = nil
319 t.stop()
320 m := q.m + 1 - (q.w - q.r)
321 if m == 0 && t.expired {
322 return 0, EAGAIN
323 }
324 if m == 0 {
325 return 0, EAGAIN
326 }
327 if m > n {
328 m = n
329 q.canWrite.Signal()
330 }
331 q.canRead.Signal()
332 return m, nil
333 }
334
335 func (q *queue) close() {
336 q.Lock()
337 defer q.Unlock()
338 q.closed = true
339 q.canRead.Broadcast()
340 q.canWrite.Broadcast()
341 }
342
343
344 type byteq struct {
345 queue
346 data []byte
347 }
348
349 func newByteq() *byteq {
350 q := &byteq{
351 data: make([]byte, 4096),
352 }
353 q.init(len(q.data))
354 return q
355 }
356
357 func (q *byteq) read(b []byte, deadline int64) (int, error) {
358 q.Lock()
359 defer q.Unlock()
360 n, err := q.waitRead(len(b), deadline)
361 if err != nil {
362 return 0, err
363 }
364 b = b[:n]
365 for len(b) > 0 {
366 m := copy(b, q.data[q.r&q.m:])
367 q.r += m
368 b = b[m:]
369 }
370 return n, nil
371 }
372
373 func (q *byteq) write(b []byte, deadline int64) (n int, err error) {
374 q.Lock()
375 defer q.Unlock()
376 for n < len(b) {
377 nn, err := q.waitWrite(len(b[n:]), deadline)
378 if err != nil {
379 return n, err
380 }
381 bb := b[n : n+nn]
382 n += nn
383 for len(bb) > 0 {
384 m := copy(q.data[q.w&q.m:], bb)
385 q.w += m
386 bb = bb[m:]
387 }
388 }
389 return n, nil
390 }
391
392
393 type msgq struct {
394 queue
395 data []interface{}
396 }
397
398 func newMsgq() *msgq {
399 q := &msgq{
400 data: make([]interface{}, 32),
401 }
402 q.init(len(q.data))
403 return q
404 }
405
406 func (q *msgq) read(deadline int64) (interface{}, error) {
407 q.Lock()
408 defer q.Unlock()
409 n, err := q.waitRead(1, deadline)
410 if err != nil {
411 return nil, err
412 }
413 if n == 0 {
414 return nil, nil
415 }
416 m := q.data[q.r&q.m]
417 q.r++
418 return m, nil
419 }
420
421 func (q *msgq) write(m interface{}, deadline int64) error {
422 q.Lock()
423 defer q.Unlock()
424 _, err := q.waitWrite(1, deadline)
425 if err != nil {
426 return err
427 }
428 q.data[q.w&q.m] = m
429 q.w++
430 return nil
431 }
432
433
434
435 type addr string
436
437
438
439 type conn struct {
440 rd *byteq
441 wr *byteq
442 local addr
443 remote addr
444 }
445
446
447
448 type pktconn struct {
449 rd *msgq
450 wr *msgq
451 local addr
452 remote addr
453 }
454
455
456 type listener struct {
457 rd *msgq
458 local addr
459 }
460
461
462 type netFile struct {
463 defaultFileImpl
464 proto *netproto
465 sotype int
466 listener *msgq
467 packet *msgq
468 rd *byteq
469 wr *byteq
470 rddeadline int64
471 wrdeadline int64
472 addr Sockaddr
473 raddr Sockaddr
474 }
475
476
477
478 type netAddr struct {
479 proto *netproto
480 sotype int
481 addr interface{}
482 }
483
484
485
486 var net = struct {
487 sync.Mutex
488 listener map[netAddr]*netFile
489 }{
490 listener: make(map[netAddr]*netFile),
491 }
492
493
494
495 var nextport = 2
496
497
498
499
500
501
502 type netproto struct {
503 bind func(*netFile, Sockaddr) error
504 }
505
506 var netprotoAF_INET = &netproto{
507 bind: func(f *netFile, sa Sockaddr) error {
508 if sa == nil {
509 f.addr = &SockaddrInet4{
510 Port: nextport,
511 Addr: [4]byte{127, 0, 0, 1},
512 }
513 nextport++
514 return nil
515 }
516 addr, ok := sa.(*SockaddrInet4)
517 if !ok {
518 return EINVAL
519 }
520 addr = addr.copy().(*SockaddrInet4)
521 if addr.Port == 0 {
522 addr.Port = nextport
523 nextport++
524 }
525 f.addr = addr
526 return nil
527 },
528 }
529
530 var netprotos = map[int]*netproto{
531 AF_INET: netprotoAF_INET,
532 }
533
534
535
536 func (f *netFile) bind(sa Sockaddr) error {
537 if f.addr != nil {
538 return EISCONN
539 }
540 if err := f.proto.bind(f, sa); err != nil {
541 return err
542 }
543 if f.sotype == SOCK_DGRAM {
544 _, ok := net.listener[netAddr{f.proto, f.sotype, f.addr.key()}]
545 if ok {
546 f.addr = nil
547 return EADDRINUSE
548 }
549 net.listener[netAddr{f.proto, f.sotype, f.addr.key()}] = f
550 f.packet = newMsgq()
551 }
552 return nil
553 }
554
555 func (f *netFile) listen(backlog int) error {
556 net.Lock()
557 defer net.Unlock()
558 if f.listener != nil {
559 return EINVAL
560 }
561 old, ok := net.listener[netAddr{f.proto, f.sotype, f.addr.key()}]
562 if ok && !old.listenerClosed() {
563 return EADDRINUSE
564 }
565 net.listener[netAddr{f.proto, f.sotype, f.addr.key()}] = f
566 f.listener = newMsgq()
567 return nil
568 }
569
570 func (f *netFile) accept() (fd int, sa Sockaddr, err error) {
571 msg, err := f.listener.read(f.readDeadline())
572 if err != nil {
573 return -1, nil, err
574 }
575 newf, ok := msg.(*netFile)
576 if !ok {
577
578 return -1, nil, EAGAIN
579 }
580 return newFD(newf), newf.raddr.copy(), nil
581 }
582
583 func (f *netFile) connect(sa Sockaddr) error {
584 if past(f.writeDeadline()) {
585 return EAGAIN
586 }
587 if f.addr == nil {
588 if err := f.bind(nil); err != nil {
589 return err
590 }
591 }
592 net.Lock()
593 if sa == nil {
594 net.Unlock()
595 return EINVAL
596 }
597 sa = sa.copy()
598 if f.raddr != nil {
599 net.Unlock()
600 return EISCONN
601 }
602 if f.sotype == SOCK_DGRAM {
603 net.Unlock()
604 f.raddr = sa
605 return nil
606 }
607 if f.listener != nil {
608 net.Unlock()
609 return EISCONN
610 }
611 l, ok := net.listener[netAddr{f.proto, f.sotype, sa.key()}]
612 if !ok {
613
614
615 if isIPv4Localhost(sa) {
616 sa = &SockaddrInet4{Port: sa.(*SockaddrInet4).Port}
617 l, ok = net.listener[netAddr{f.proto, f.sotype, sa.key()}]
618 }
619 }
620 if !ok || l.listenerClosed() {
621 net.Unlock()
622 return ECONNREFUSED
623 }
624 f.raddr = sa
625 f.rd = newByteq()
626 f.wr = newByteq()
627 newf := &netFile{
628 proto: f.proto,
629 sotype: f.sotype,
630 addr: f.raddr,
631 raddr: f.addr,
632 rd: f.wr,
633 wr: f.rd,
634 }
635 net.Unlock()
636 l.listener.write(newf, f.writeDeadline())
637 return nil
638 }
639
640 func (f *netFile) read(b []byte) (int, error) {
641 if f.rd == nil {
642 if f.raddr != nil {
643 n, _, err := f.recvfrom(b, 0)
644 return n, err
645 }
646 return 0, ENOTCONN
647 }
648 return f.rd.read(b, f.readDeadline())
649 }
650
651 func (f *netFile) write(b []byte) (int, error) {
652 if f.wr == nil {
653 if f.raddr != nil {
654 err := f.sendto(b, 0, f.raddr)
655 var n int
656 if err == nil {
657 n = len(b)
658 }
659 return n, err
660 }
661 return 0, ENOTCONN
662 }
663 return f.wr.write(b, f.writeDeadline())
664 }
665
666 type pktmsg struct {
667 buf []byte
668 addr Sockaddr
669 }
670
671 func (f *netFile) recvfrom(p []byte, flags int) (n int, from Sockaddr, err error) {
672 if f.sotype != SOCK_DGRAM {
673 return 0, nil, EINVAL
674 }
675 if f.packet == nil {
676 return 0, nil, ENOTCONN
677 }
678 msg1, err := f.packet.read(f.readDeadline())
679 if err != nil {
680 return 0, nil, err
681 }
682 msg, ok := msg1.(*pktmsg)
683 if !ok {
684 return 0, nil, EAGAIN
685 }
686 return copy(p, msg.buf), msg.addr, nil
687 }
688
689 func (f *netFile) sendto(p []byte, flags int, to Sockaddr) error {
690 if f.sotype != SOCK_DGRAM {
691 return EINVAL
692 }
693 if f.packet == nil {
694 if err := f.bind(nil); err != nil {
695 return err
696 }
697 }
698 net.Lock()
699 if to == nil {
700 net.Unlock()
701 return EINVAL
702 }
703 to = to.copy()
704 l, ok := net.listener[netAddr{f.proto, f.sotype, to.key()}]
705 if !ok || l.packet == nil {
706 net.Unlock()
707 return ECONNREFUSED
708 }
709 net.Unlock()
710 msg := &pktmsg{
711 buf: make([]byte, len(p)),
712 addr: f.addr,
713 }
714 copy(msg.buf, p)
715 l.packet.write(msg, f.writeDeadline())
716 return nil
717 }
718
719 func (f *netFile) listenerClosed() bool {
720 f.listener.Lock()
721 defer f.listener.Unlock()
722 return f.listener.closed
723 }
724
725 func (f *netFile) close() error {
726 if f.listener != nil {
727 f.listener.close()
728 }
729 if f.packet != nil {
730 f.packet.close()
731 }
732 if f.rd != nil {
733 f.rd.close()
734 }
735 if f.wr != nil {
736 f.wr.close()
737 }
738 return nil
739 }
740
741 func fdToNetFile(fd int) (*netFile, error) {
742 f, err := fdToFile(fd)
743 if err != nil {
744 return nil, err
745 }
746 impl := f.impl
747 netf, ok := impl.(*netFile)
748 if !ok {
749 return nil, EINVAL
750 }
751 return netf, nil
752 }
753
754 func Socket(proto, sotype, unused int) (fd int, err error) {
755 p := netprotos[proto]
756 if p == nil {
757 return -1, EPROTONOSUPPORT
758 }
759 if sotype != SOCK_STREAM && sotype != SOCK_DGRAM {
760 return -1, ESOCKTNOSUPPORT
761 }
762 f := &netFile{
763 proto: p,
764 sotype: sotype,
765 }
766 return newFD(f), nil
767 }
768
769 func Bind(fd int, sa Sockaddr) error {
770 f, err := fdToNetFile(fd)
771 if err != nil {
772 return err
773 }
774 return f.bind(sa)
775 }
776
777 func StopIO(fd int) error {
778 f, err := fdToNetFile(fd)
779 if err != nil {
780 return err
781 }
782 f.close()
783 return nil
784 }
785
786 func Listen(fd int, backlog int) error {
787 f, err := fdToNetFile(fd)
788 if err != nil {
789 return err
790 }
791 return f.listen(backlog)
792 }
793
794 func Accept(fd int) (newfd int, sa Sockaddr, err error) {
795 f, err := fdToNetFile(fd)
796 if err != nil {
797 return 0, nil, err
798 }
799 return f.accept()
800 }
801
802 func Getsockname(fd int) (sa Sockaddr, err error) {
803 f, err := fdToNetFile(fd)
804 if err != nil {
805 return nil, err
806 }
807 if f.addr == nil {
808 return nil, ENOTCONN
809 }
810 return f.addr.copy(), nil
811 }
812
813 func Getpeername(fd int) (sa Sockaddr, err error) {
814 f, err := fdToNetFile(fd)
815 if err != nil {
816 return nil, err
817 }
818 if f.raddr == nil {
819 return nil, ENOTCONN
820 }
821 return f.raddr.copy(), nil
822 }
823
824 func Connect(fd int, sa Sockaddr) error {
825 f, err := fdToNetFile(fd)
826 if err != nil {
827 return err
828 }
829 return f.connect(sa)
830 }
831
832 func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
833 f, err := fdToNetFile(fd)
834 if err != nil {
835 return 0, nil, err
836 }
837 return f.recvfrom(p, flags)
838 }
839
840 func Sendto(fd int, p []byte, flags int, to Sockaddr) error {
841 f, err := fdToNetFile(fd)
842 if err != nil {
843 return err
844 }
845 return f.sendto(p, flags, to)
846 }
847
848 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn, recvflags int, from Sockaddr, err error) {
849 f, err := fdToNetFile(fd)
850 if err != nil {
851 return
852 }
853 n, from, err = f.recvfrom(p, flags)
854 return
855 }
856
857 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) error {
858 _, err := SendmsgN(fd, p, oob, to, flags)
859 return err
860 }
861
862 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
863 f, err := fdToNetFile(fd)
864 if err != nil {
865 return 0, err
866 }
867 switch f.sotype {
868 case SOCK_STREAM:
869 n, err = f.write(p)
870 case SOCK_DGRAM:
871 n = len(p)
872 err = f.sendto(p, flags, to)
873 }
874 if err != nil {
875 return 0, err
876 }
877 return n, nil
878 }
879
880 func GetsockoptInt(fd, level, opt int) (value int, err error) {
881 f, err := fdToNetFile(fd)
882 if err != nil {
883 return 0, err
884 }
885 switch {
886 case level == SOL_SOCKET && opt == SO_TYPE:
887 return f.sotype, nil
888 }
889 return 0, ENOTSUP
890 }
891
892 func SetsockoptInt(fd, level, opt int, value int) error {
893 return nil
894 }
895
896 func SetsockoptByte(fd, level, opt int, value byte) error {
897 _, err := fdToNetFile(fd)
898 if err != nil {
899 return err
900 }
901 return ENOTSUP
902 }
903
904 func SetsockoptLinger(fd, level, opt int, l *Linger) error {
905 return nil
906 }
907
908 func SetReadDeadline(fd int, t int64) error {
909 f, err := fdToNetFile(fd)
910 if err != nil {
911 return err
912 }
913 atomic.StoreInt64(&f.rddeadline, t)
914 if bq := f.rd; bq != nil {
915 bq.Lock()
916 if timer := bq.rtimer; timer != nil {
917 timer.reset(&bq.queue, t)
918 }
919 bq.Unlock()
920 }
921 return nil
922 }
923
924 func (f *netFile) readDeadline() int64 {
925 return atomic.LoadInt64(&f.rddeadline)
926 }
927
928 func SetWriteDeadline(fd int, t int64) error {
929 f, err := fdToNetFile(fd)
930 if err != nil {
931 return err
932 }
933 atomic.StoreInt64(&f.wrdeadline, t)
934 if bq := f.wr; bq != nil {
935 bq.Lock()
936 if timer := bq.wtimer; timer != nil {
937 timer.reset(&bq.queue, t)
938 }
939 bq.Unlock()
940 }
941 return nil
942 }
943
944 func (f *netFile) writeDeadline() int64 {
945 return atomic.LoadInt64(&f.wrdeadline)
946 }
947
948 func Shutdown(fd int, how int) error {
949 f, err := fdToNetFile(fd)
950 if err != nil {
951 return err
952 }
953 switch how {
954 case SHUT_RD:
955 f.rd.close()
956 case SHUT_WR:
957 f.wr.close()
958 case SHUT_RDWR:
959 f.rd.close()
960 f.wr.close()
961 }
962 return nil
963 }
964
965 func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { panic("SetsockoptICMPv") }
966 func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) error { panic("SetsockoptIPMreq") }
967 func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) error { panic("SetsockoptIPv") }
968 func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) error { panic("SetsockoptInet") }
969 func SetsockoptString(fd, level, opt int, s string) error { panic("SetsockoptString") }
970 func SetsockoptTimeval(fd, level, opt int, tv *Timeval) error { panic("SetsockoptTimeval") }
971 func Socketpair(domain, typ, proto int) (fd [2]int, err error) { panic("Socketpair") }
972
973 func SetNonblock(fd int, nonblocking bool) error { return nil }
974
View as plain text