summaryrefslogtreecommitdiff
path: root/jni/ruby/ext/socket/mkconstants.rb
blob: 59fcb176823b9c66eeb889985952a56d108c51c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
require 'optparse'
require 'erb'

opt = OptionParser.new

opt.def_option('-h', 'help') {
  puts opt
  exit 0
}

opt_o = nil
opt.def_option('-o FILE', 'specify output file') {|filename|
  opt_o = filename
}

opt_H = nil
opt.def_option('-H FILE', 'specify output header file') {|filename|
  opt_H = filename
}

C_ESC = {
  "\\" => "\\\\",
  '"' => '\"',
  "\n" => '\n',
}

0x00.upto(0x1f) {|ch| C_ESC[[ch].pack("C")] ||= "\\%03o" % ch }
0x7f.upto(0xff) {|ch| C_ESC[[ch].pack("C")] = "\\%03o" % ch }
C_ESC_PAT = Regexp.union(*C_ESC.keys)

def c_str(str)
  '"' + str.gsub(C_ESC_PAT) {|s| C_ESC[s]} + '"'
end

opt.parse!



h = {}
COMMENTS = Hash.new { |h, name| h[name] = name }

DATA.each_line {|s|
  name, default_value, comment = s.chomp.split(/\s+/, 3)
  next unless name && name[0] != ?#

  default_value = nil if default_value == 'nil'

  if h.has_key? name
    warn "#{$.}: warning: duplicate name: #{name}"
    next
  end
  h[name] = default_value
  COMMENTS[name] = comment
}
DEFS = h.to_a

def each_const
  DEFS.each {|name, default_value|
    guard = nil
    if /\A(AF_INET6|PF_INET6|IPV6_.*)\z/ =~ name
      # IPv6 is not supported although AF_INET6 is defined on mingw
      guard = "defined(INET6)"
    end
    yield guard, name, default_value
  }
end

def each_name(pat)
  DEFS.each {|name, default_value|
    next if pat !~ name
    yield name
  }
end

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls")
% each_const {|guard, name, default_value|
#if !defined(<%=name%>)
# if defined(HAVE_CONST_<%=name.upcase%>)
#  define <%=name%> <%=name%>
%if default_value
# else
#  define <%=name%> <%=default_value%>
%end
# endif
#endif
% }
EOS

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs_in_guard(name, default_value)")
#if defined(<%=name%>)
    /* <%= COMMENTS[name] %> */
    rb_define_const(rb_cSocket, <%=c_str name%>, INTEGER2NUM(<%=name%>));
    /* <%= COMMENTS[name] %> */
    rb_define_const(rb_mSockConst, <%=c_str name%>, INTEGER2NUM(<%=name%>));
#endif
EOS

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs")
% each_const {|guard, name, default_value|
%   if guard
#if <%=guard%>
<%= gen_const_defs_in_guard(name, default_value).chomp %>
#endif
%   else
<%= gen_const_defs_in_guard(name, default_value).chomp %>
%   end
% }
EOS

def reverse_each_name(pat)
  DEFS.reverse_each {|name, default_value|
    next if pat !~ name
    yield name
  }
end

def each_names_with_len(pat, prefix_optional=nil)
  h = {}
  DEFS.each {|name, default_value|
    next if pat !~ name
    (h[name.length] ||= []) << [name, name]
  }
  if prefix_optional
    if Regexp === prefix_optional
      prefix_pat = prefix_optional
    else
      prefix_pat = /\A#{Regexp.escape prefix_optional}/
    end
    DEFS.each {|const, default_value|
      next if pat !~ const
      next if prefix_pat !~ const
      name = $'
      (h[name.length] ||= []) << [name, const]
    }
  end
  hh = {}
  h.each {|len, pairs|
    pairs.each {|name, const|
      raise "name crash: #{name}" if hh[name]
      hh[name] = true
    }
  }
  h.keys.sort.each {|len|
    yield h[len], len
  }
end

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_decl(funcname, pat, prefix_optional, guard=nil)")
%if guard
#ifdef <%=guard%>
int <%=funcname%>(const char *str, long len, int *valp);
#endif
%else
int <%=funcname%>(const char *str, long len, int *valp);
%end
EOS

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard=nil)")
int
<%=funcname%>(const char *str, long len, int *valp)
{
    switch (len) {
%    each_names_with_len(pat, prefix_optional) {|pairs, len|
      case <%=len%>:
%      pairs.each {|name, const|
#ifdef <%=const%>
        if (memcmp(str, <%=c_str name%>, <%=len%>) == 0) { *valp = <%=const%>; return 0; }
#endif
%      }
        return -1;

%    }
      default:
        return -1;
    }
}
EOS

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func(funcname, pat, prefix_optional, guard=nil)")
%if guard
#ifdef <%=guard%>
<%=gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard)%>
#endif
%else
<%=gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard)%>
%end
EOS

NAME_TO_INT_DEFS = []
def def_name_to_int(funcname, pat, prefix_optional, guard=nil)
  decl = gen_name_to_int_decl(funcname, pat, prefix_optional, guard)
  func = gen_name_to_int_func(funcname, pat, prefix_optional, guard)
  NAME_TO_INT_DEFS << [decl, func]
end

def reverse_each_name_with_prefix_optional(pat, prefix_pat)
  reverse_each_name(pat) {|n|
    yield n, n
  }
  if prefix_pat
    reverse_each_name(pat) {|n|
      next if prefix_pat !~ n
      yield n, $'
    }
  end
end

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pat, prefix_pat)")
    <%=hash_var%> = st_init_numtable();
% reverse_each_name_with_prefix_optional(pat, prefix_pat) {|n,s|
#ifdef <%=n%>
    st_insert(<%=hash_var%>, (st_data_t)<%=n%>, (st_data_t)rb_intern2(<%=c_str s%>, <%=s.length%>));
#endif
% }
EOS

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_func(func_name, hash_var)")
ID
<%=func_name%>(int val)
{
    st_data_t name;
    if (st_lookup(<%=hash_var%>, (st_data_t)val, &name))
        return (ID)name;
    return 0;
}
EOS

ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_decl(func_name, hash_var)")
ID <%=func_name%>(int val);
EOS

INTERN_DEFS = []
def def_intern(func_name, pat, prefix_optional=nil)
  prefix_pat = nil
  if prefix_optional
    if Regexp === prefix_optional
      prefix_pat = prefix_optional
    else
      prefix_pat = /\A#{Regexp.escape prefix_optional}/
    end
  end
  hash_var = "#{func_name}_hash"
  vardef = "static st_table *#{hash_var};"
  gen_hash = gen_int_to_name_hash(hash_var, pat, prefix_pat)
  decl = gen_int_to_name_decl(func_name, hash_var)
  func = gen_int_to_name_func(func_name, hash_var)
  INTERN_DEFS << [vardef, gen_hash, decl, func]
end

def_name_to_int("rsock_family_to_int", /\A(AF_|PF_)/, "AF_")
def_name_to_int("rsock_socktype_to_int", /\ASOCK_/, "SOCK_")
def_name_to_int("rsock_ipproto_to_int", /\AIPPROTO_/, "IPPROTO_")
def_name_to_int("rsock_unknown_level_to_int", /\ASOL_SOCKET\z/, "SOL_")
def_name_to_int("rsock_ip_level_to_int", /\A(SOL_SOCKET\z|IPPROTO_)/, /\A(SOL_|IPPROTO_)/)
def_name_to_int("rsock_so_optname_to_int", /\ASO_/, "SO_")
def_name_to_int("rsock_ip_optname_to_int", /\AIP_/, "IP_")
def_name_to_int("rsock_ipv6_optname_to_int", /\AIPV6_/, "IPV6_", "IPPROTO_IPV6")
def_name_to_int("rsock_tcp_optname_to_int", /\ATCP_/, "TCP_")
def_name_to_int("rsock_udp_optname_to_int", /\AUDP_/, "UDP_")
def_name_to_int("rsock_shutdown_how_to_int", /\ASHUT_/, "SHUT_")
def_name_to_int("rsock_scm_optname_to_int", /\ASCM_/, "SCM_")

def_intern('rsock_intern_family',  /\AAF_/)
def_intern('rsock_intern_family_noprefix',  /\AAF_/, "AF_")
def_intern('rsock_intern_protocol_family',  /\APF_/)
def_intern('rsock_intern_socktype',  /\ASOCK_/)
def_intern('rsock_intern_ipproto',  /\AIPPROTO_/)
def_intern('rsock_intern_iplevel',  /\A(SOL_SOCKET\z|IPPROTO_)/, /\A(SOL_|IPPROTO_)/)
def_intern('rsock_intern_so_optname',  /\ASO_/, "SO_")
def_intern('rsock_intern_ip_optname',  /\AIP_/, "IP_")
def_intern('rsock_intern_ipv6_optname',  /\AIPV6_/, "IPV6_")
def_intern('rsock_intern_tcp_optname',  /\ATCP_/, "TCP_")
def_intern('rsock_intern_udp_optname',  /\AUDP_/, "UDP_")
def_intern('rsock_intern_scm_optname',  /\ASCM_/, "SCM_")
def_intern('rsock_intern_local_optname',  /\ALOCAL_/, "LOCAL_")

result = ERB.new(<<'EOS', nil, '%').result(binding)
/* autogenerated file */

<%= INTERN_DEFS.map {|vardef, gen_hash, decl, func| vardef }.join("\n") %>

#ifdef HAVE_LONG_LONG
#define INTEGER2NUM(n) \
    (FIXNUM_MAX < (n) ? ULL2NUM(n) : \
     FIXNUM_MIN > (LONG_LONG)(n) ? LL2NUM(n) : \
     LONG2FIX(n))
#else
#define INTEGER2NUM(n) \
    (FIXNUM_MAX < (n) ? ULONG2NUM(n) : \
     FIXNUM_MIN > (long)(n) ? LONG2NUM(n) : \
     LONG2FIX(n))
#endif

static void
init_constants(void)
{
    /*
     * Document-module: Socket::Constants
     *
     * Socket::Constants provides socket-related constants.  All possible
     * socket constants are listed in the documentation but they may not all
     * be present on your platform.
     *
     * If the underlying platform doesn't define a constant the corresponding
     * Ruby constant is not defined.
     *
     */
    rb_mSockConst = rb_define_module_under(rb_cSocket, "Constants");

<%= gen_const_defs %>
<%= INTERN_DEFS.map {|vardef, gen_hash, decl, func| gen_hash }.join("\n") %>
}

<%= NAME_TO_INT_DEFS.map {|decl, func| func }.join("\n") %>

<%= INTERN_DEFS.map {|vardef, gen_hash, decl, func| func }.join("\n") %>

EOS

header_result = ERB.new(<<'EOS', nil, '%').result(binding)
/* autogenerated file */
<%= gen_const_decls %>
<%= NAME_TO_INT_DEFS.map {|decl, func| decl }.join("\n") %>
<%= INTERN_DEFS.map {|vardef, gen_hash, decl, func| decl }.join("\n") %>
EOS

if opt_H
  File.open(opt_H, 'w') {|f|
    f << header_result
  }
else
  result = header_result + result
end

if opt_o
  File.open(opt_o, 'w') {|f|
    f << result
  }
else
  $stdout << result
end

__END__

SOCK_STREAM     nil     A stream socket provides a sequenced, reliable two-way connection for a byte stream
SOCK_DGRAM      nil     A datagram socket provides connectionless, unreliable messaging
SOCK_RAW        nil     A raw socket provides low-level access for direct access or implementing network protocols
SOCK_RDM        nil     A reliable datagram socket provides reliable delivery of messages
SOCK_SEQPACKET  nil     A sequential packet socket provides sequenced, reliable two-way connection for datagrams
SOCK_PACKET     nil     Device-level packet access

AF_UNSPEC       nil     Unspecified protocol, any supported address family
PF_UNSPEC       nil     Unspecified protocol, any supported address family
AF_INET nil     IPv4 protocol
PF_INET nil     IPv4 protocol
AF_INET6        nil     IPv6 protocol
PF_INET6        nil     IPv6 protocol
AF_UNIX nil     UNIX sockets
PF_UNIX nil     UNIX sockets
AF_AX25 nil     AX.25 protocol
PF_AX25 nil     AX.25 protocol
AF_IPX  nil     IPX protocol
PF_IPX  nil     IPX protocol
AF_APPLETALK    nil     AppleTalk protocol
PF_APPLETALK    nil     AppleTalk protocol
AF_LOCAL        nil     Host-internal protocols
PF_LOCAL        nil     Host-internal protocols
AF_IMPLINK      nil     ARPANET IMP protocol
PF_IMPLINK      nil     ARPANET IMP protocol
AF_PUP  nil     PARC Universal Packet protocol
PF_PUP  nil     PARC Universal Packet protocol
AF_CHAOS        nil     MIT CHAOS protocols
PF_CHAOS        nil     MIT CHAOS protocols
AF_NS   nil     XEROX NS protocols
PF_NS   nil     XEROX NS protocols
AF_ISO  nil     ISO Open Systems Interconnection protocols
PF_ISO  nil     ISO Open Systems Interconnection protocols
AF_OSI  nil     ISO Open Systems Interconnection protocols
PF_OSI  nil     ISO Open Systems Interconnection protocols
AF_ECMA nil     European Computer Manufacturers protocols
PF_ECMA nil     European Computer Manufacturers protocols
AF_DATAKIT      nil     Datakit protocol
PF_DATAKIT      nil     Datakit protocol
AF_CCITT        nil     CCITT (now ITU-T) protocols
PF_CCITT        nil     CCITT (now ITU-T) protocols
AF_SNA  nil     IBM SNA protocol
PF_SNA  nil     IBM SNA protocol
AF_DEC  nil     DECnet protocol
PF_DEC  nil     DECnet protocol
AF_DLI  nil     DEC Direct Data Link Interface protocol
PF_DLI  nil     DEC Direct Data Link Interface protocol
AF_LAT  nil     Local Area Transport protocol
PF_LAT  nil     Local Area Transport protocol
AF_HYLINK       nil     NSC Hyperchannel protocol
PF_HYLINK       nil     NSC Hyperchannel protocol
AF_ROUTE        nil     Internal routing protocol
PF_ROUTE        nil     Internal routing protocol
AF_LINK nil     Link layer interface
PF_LINK nil     Link layer interface
AF_COIP nil     Connection-oriented IP
PF_COIP nil     Connection-oriented IP
AF_CNT  nil     Computer Network Technology
PF_CNT  nil     Computer Network Technology
AF_SIP  nil     Simple Internet Protocol
PF_SIP  nil     Simple Internet Protocol
AF_NDRV nil     Network driver raw access
PF_NDRV nil     Network driver raw access
AF_ISDN nil     Integrated Services Digital Network
PF_ISDN nil     Integrated Services Digital Network
AF_NATM nil     Native ATM access
PF_NATM nil     Native ATM access
AF_SYSTEM
PF_SYSTEM
AF_NETBIOS      nil     NetBIOS
PF_NETBIOS      nil     NetBIOS
AF_PPP  nil     Point-to-Point Protocol
PF_PPP  nil     Point-to-Point Protocol
AF_ATM  nil     Asynchronous Transfer Mode
PF_ATM  nil     Asynchronous Transfer Mode
AF_NETGRAPH     nil     Netgraph sockets
PF_NETGRAPH     nil     Netgraph sockets
AF_MAX  nil     Maximum address family for this platform
PF_MAX  nil     Maximum address family for this platform
AF_PACKET       nil     Direct link-layer access
PF_PACKET       nil     Direct link-layer access

AF_E164 nil     CCITT (ITU-T) E.164 recommendation
PF_XTP  nil     eXpress Transfer Protocol
PF_RTIP
PF_PIP
PF_KEY

MSG_OOB nil     Process out-of-band data
MSG_PEEK        nil     Peek at incoming message
MSG_DONTROUTE   nil     Send without using the routing tables
MSG_EOR nil     Data completes record
MSG_TRUNC       nil     Data discarded before delivery
MSG_CTRUNC      nil     Control data lost before delivery
MSG_WAITALL     nil     Wait for full request or error
MSG_DONTWAIT    nil     This message should be non-blocking
MSG_EOF nil     Data completes connection
MSG_FLUSH       nil     Start of a hold sequence.  Dumps to so_temp
MSG_HOLD        nil     Hold fragment in so_temp
MSG_SEND        nil     Send the packet in so_temp
MSG_HAVEMORE    nil     Data ready to be read
MSG_RCVMORE     nil     Data remains in the current packet
MSG_COMPAT      nil     End of record
MSG_PROXY       nil     Wait for full request
MSG_FIN
MSG_SYN
MSG_CONFIRM     nil     Confirm path validity
MSG_RST
MSG_ERRQUEUE    nil     Fetch message from error queue
MSG_NOSIGNAL    nil     Do not generate SIGPIPE
MSG_MORE        nil     Sender will send more
MSG_FASTOPEN nil Reduce step of the handshake process

SOL_SOCKET      nil     Socket-level options
SOL_IP  nil     IP socket options
SOL_IPX nil     IPX socket options
SOL_AX25        nil     AX.25 socket options
SOL_ATALK       nil     AppleTalk socket options
SOL_TCP nil     TCP socket options
SOL_UDP nil     UDP socket options

IPPROTO_IP      0       Dummy protocol for IP
IPPROTO_ICMP    1       Control message protocol
IPPROTO_IGMP    nil     Group Management Protocol
IPPROTO_GGP     nil     Gateway to Gateway Protocol
IPPROTO_TCP     6       TCP
IPPROTO_EGP     nil     Exterior Gateway Protocol
IPPROTO_PUP     nil     PARC Universal Packet protocol
IPPROTO_UDP     17      UDP
IPPROTO_IDP     nil     XNS IDP
IPPROTO_HELLO   nil     "hello" routing protocol
IPPROTO_ND      nil     Sun net disk protocol
IPPROTO_TP      nil     ISO transport protocol class 4
IPPROTO_XTP     nil     Xpress Transport Protocol
IPPROTO_EON     nil     ISO cnlp
IPPROTO_BIP
IPPROTO_AH      nil     IP6 auth header
IPPROTO_DSTOPTS nil     IP6 destination option
IPPROTO_ESP     nil     IP6 Encapsulated Security Payload
IPPROTO_FRAGMENT        nil     IP6 fragmentation header
IPPROTO_HOPOPTS nil     IP6 hop-by-hop options
IPPROTO_ICMPV6  nil     ICMP6
IPPROTO_IPV6    nil     IP6 header
IPPROTO_NONE    nil     IP6 no next header
IPPROTO_ROUTING nil     IP6 routing header

IPPROTO_RAW     255     Raw IP packet
IPPROTO_MAX     nil     Maximum IPPROTO constant

# Some port configuration
IPPORT_RESERVED         1024    Default minimum address for bind or connect
IPPORT_USERRESERVED     5000    Default maximum address for bind or connect

# Some reserved IP v.4 addresses
INADDR_ANY              0x00000000      A socket bound to INADDR_ANY receives packets from all interfaces and sends from the default IP address
INADDR_BROADCAST        0xffffffff      The network broadcast address
INADDR_LOOPBACK         0x7F000001      The loopback address
INADDR_UNSPEC_GROUP     0xe0000000      The reserved multicast group
INADDR_ALLHOSTS_GROUP   0xe0000001      Multicast group for all systems on this subset
INADDR_MAX_LOCAL_GROUP  0xe00000ff      The last local network multicast group
INADDR_NONE             0xffffffff      A bitmask for matching no valid IP address

# IP [gs]etsockopt options
IP_OPTIONS      nil     IP options to be included in packets
IP_HDRINCL      nil     Header is included with data
IP_TOS  nil     IP type-of-service
IP_TTL  nil     IP time-to-live
IP_RECVOPTS     nil     Receive all IP options with datagram
IP_RECVRETOPTS  nil     Receive all IP options for response
IP_RECVDSTADDR  nil     Receive IP destination address with datagram
IP_RETOPTS      nil     IP options to be included in datagrams
IP_MINTTL       nil     Minimum TTL allowed for received packets
IP_DONTFRAG     nil     Don't fragment packets
IP_SENDSRCADDR  nil     Source address for outgoing UDP datagrams
IP_ONESBCAST    nil     Force outgoing broadcast datagrams to have the undirected broadcast address
IP_RECVTTL      nil     Receive IP TTL with datagrams
IP_RECVIF       nil     Receive interface information with datagrams
IP_RECVSLLA     nil     Receive link-layer address with datagrams
IP_PORTRANGE    nil     Set the port range for sockets with unspecified port numbers
IP_MULTICAST_IF nil     IP multicast interface
IP_MULTICAST_TTL        nil     IP multicast TTL
IP_MULTICAST_LOOP       nil     IP multicast loopback
IP_ADD_MEMBERSHIP       nil     Add a multicast group membership
IP_DROP_MEMBERSHIP      nil     Drop a multicast group membership
IP_DEFAULT_MULTICAST_TTL        nil     Default multicast TTL
IP_DEFAULT_MULTICAST_LOOP       nil     Default multicast loopback
IP_MAX_MEMBERSHIPS      nil     Maximum number multicast groups a socket can join
IP_ROUTER_ALERT nil     Notify transit routers to more closely examine the contents of an IP packet
IP_PKTINFO      nil     Receive packet information with datagrams
IP_PKTOPTIONS   nil     Receive packet options with datagrams
IP_MTU_DISCOVER nil     Path MTU discovery
IP_RECVERR      nil     Enable extended reliable error message passing
IP_RECVTOS      nil     Receive TOS with incoming packets
IP_MTU  nil     The Maximum Transmission Unit of the socket
IP_FREEBIND     nil     Allow binding to nonexistent IP addresses
IP_IPSEC_POLICY nil     IPsec security policy
IP_XFRM_POLICY
IP_PASSSEC      nil     Retrieve security context with datagram
IP_TRANSPARENT  nil     Transparent proxy
IP_PMTUDISC_DONT        nil     Never send DF frames
IP_PMTUDISC_WANT        nil     Use per-route hints
IP_PMTUDISC_DO  nil     Always send DF frames
IP_UNBLOCK_SOURCE       nil     Unblock IPv4 multicast packets with a give source address
IP_BLOCK_SOURCE nil     Block IPv4 multicast packets with a give source address
IP_ADD_SOURCE_MEMBERSHIP        nil     Add a multicast group membership
IP_DROP_SOURCE_MEMBERSHIP       nil     Drop a multicast group membership
IP_MSFILTER     nil     Multicast source filtering

MCAST_JOIN_GROUP        nil     Join a multicast group
MCAST_BLOCK_SOURCE      nil     Block multicast packets from this source
MCAST_UNBLOCK_SOURCE    nil     Unblock multicast packets from this source
MCAST_LEAVE_GROUP       nil     Leave a multicast group
MCAST_JOIN_SOURCE_GROUP nil     Join a multicast source group
MCAST_LEAVE_SOURCE_GROUP        nil     Leave a multicast source group
MCAST_MSFILTER  nil     Multicast source filtering
MCAST_EXCLUDE   nil     Exclusive multicast source filter
MCAST_INCLUDE   nil     Inclusive multicast source filter

SO_DEBUG        nil     Debug info recording
SO_REUSEADDR    nil     Allow local address reuse
SO_REUSEPORT    nil     Allow local address and port reuse
SO_TYPE nil     Get the socket type
SO_ERROR        nil     Get and clear the error status
SO_DONTROUTE    nil     Use interface addresses
SO_BROADCAST    nil     Permit sending of broadcast messages
SO_SNDBUF       nil     Send buffer size
SO_RCVBUF       nil     Receive buffer size
SO_SNDBUFFORCE  nil     Send buffer size without wmem_max limit (Linux 2.6.14)
SO_RCVBUFFORCE  nil     Receive buffer size without rmem_max limit (Linux 2.6.14)
SO_KEEPALIVE    nil     Keep connections alive
SO_OOBINLINE    nil     Leave received out-of-band data in-line
SO_NO_CHECK     nil     Disable checksums
SO_PRIORITY     nil     The protocol-defined priority for all packets on this socket
SO_LINGER       nil     Linger on close if data is present
SO_PASSCRED     nil     Receive SCM_CREDENTIALS messages
SO_PEERCRED     nil     The credentials of the foreign process connected to this socket
SO_RCVLOWAT     nil     Receive low-water mark
SO_SNDLOWAT     nil     Send low-water mark
SO_RCVTIMEO     nil     Receive timeout
SO_SNDTIMEO     nil     Send timeout
SO_ACCEPTCONN   nil     Socket has had listen() called on it
SO_USELOOPBACK  nil     Bypass hardware when possible
SO_ACCEPTFILTER nil     There is an accept filter
SO_DONTTRUNC    nil     Retain unread data
SO_WANTMORE     nil     Give a hint when more data is ready
SO_WANTOOBFLAG  nil     OOB data is wanted in MSG_FLAG on receive
SO_NREAD        nil     Get first packet byte count
SO_NKE  nil     Install socket-level Network Kernel Extension
SO_NOSIGPIPE    nil     Don't SIGPIPE on EPIPE
SO_SECURITY_AUTHENTICATION
SO_SECURITY_ENCRYPTION_TRANSPORT
SO_SECURITY_ENCRYPTION_NETWORK
SO_BINDTODEVICE nil     Only send packets from the given interface
SO_ATTACH_FILTER        nil     Attach an accept filter
SO_DETACH_FILTER        nil     Detach an accept filter
SO_GET_FILTER   nil     Obtain filter set by SO_ATTACH_FILTER (Linux 3.8)
SO_PEERNAME     nil     Name of the connecting user
SO_TIMESTAMP    nil     Receive timestamp with datagrams (timeval)
SO_TIMESTAMPNS  nil     Receive nanosecond timestamp with datagrams (timespec)
SO_BINTIME      nil     Receive timestamp with datagrams (bintime)
SO_RECVUCRED    nil     Receive user credentials with datagram
SO_MAC_EXEMPT   nil     Mandatory Access Control exemption for unlabeled peers
SO_ALLZONES     nil     Bypass zone boundaries
SO_PEERSEC      nil     Obtain the security credentials (Linux 2.6.2)
SO_PASSSEC      nil     Toggle security context passing (Linux 2.6.18)
SO_MARK         nil     Set the mark for mark-based routing (Linux 2.6.25)
SO_TIMESTAMPING nil     Time stamping of incoming and outgoing packets (Linux 2.6.30)
SO_PROTOCOL     nil     Protocol given for socket() (Linux 2.6.32)
SO_DOMAIN       nil     Domain given for socket() (Linux 2.6.32)
SO_RXQ_OVFL     nil     Toggle cmsg for number of packets dropped (Linux 2.6.33)
SO_WIFI_STATUS  nil     Toggle cmsg for wifi status (Linux 3.3)
SO_PEEK_OFF     nil     Set the peek offset (Linux 3.4)
SO_NOFCS        nil     Set netns of a socket (Linux 3.4)
SO_LOCK_FILTER  nil     Lock the filter attached to a socket (Linux 3.9)
SO_SELECT_ERR_QUEUE     nil     Make select() detect socket error queue with errorfds (Linux 3.10)
SO_BUSY_POLL    nil     Set the threshold in microseconds for low latency polling (Linux 3.11)
SO_MAX_PACING_RATE      nil     Cap the rate computed by transport layer. [bytes per second] (Linux 3.13)
SO_BPF_EXTENSIONS       nil     Query supported BPF extensions (Linux 3.14)

SOPRI_INTERACTIVE       nil     Interactive socket priority
SOPRI_NORMAL    nil     Normal socket priority
SOPRI_BACKGROUND        nil     Background socket priority

IPX_TYPE

TCP_NODELAY     nil     Don't delay sending to coalesce packets
TCP_MAXSEG      nil     Set maximum segment size
TCP_CORK        nil     Don't send partial frames (Linux 2.2, glibc 2.2)
TCP_DEFER_ACCEPT        nil     Don't notify a listening socket until data is ready (Linux 2.4, glibc 2.2)
TCP_INFO        nil     Retrieve information about this socket (Linux 2.4, glibc 2.2)
TCP_KEEPCNT     nil     Maximum number of keepalive probes allowed before dropping a connection (Linux 2.4, glibc 2.2)
TCP_KEEPIDLE    nil     Idle time before keepalive probes are sent (Linux 2.4, glibc 2.2)
TCP_KEEPINTVL   nil     Time between keepalive probes (Linux 2.4, glibc 2.2)
TCP_LINGER2     nil     Lifetime of orphaned FIN_WAIT2 sockets (Linux 2.4, glibc 2.2)
TCP_MD5SIG      nil     Use MD5 digests (RFC2385, Linux 2.6.20, glibc 2.7)
TCP_NOOPT       nil     Don't use TCP options
TCP_NOPUSH      nil     Don't push the last block of write
TCP_QUICKACK    nil     Enable quickack mode (Linux 2.4.4, glibc 2.3)
TCP_SYNCNT      nil     Number of SYN retransmits before a connection is dropped (Linux 2.4, glibc 2.2)
TCP_WINDOW_CLAMP        nil     Clamp the size of the advertised window (Linux 2.4, glibc 2.2)
TCP_FASTOPEN nil Reduce step of the handshake process (Linux 3.7, glibc 2.18)
TCP_CONGESTION  nil     TCP congestion control algorithm (Linux 2.6.13, glibc 2.6)
TCP_COOKIE_TRANSACTIONS nil     TCP Cookie Transactions (Linux 2.6.33, glibc 2.18)
TCP_QUEUE_SEQ   nil     Sequence of a queue for repair mode (Linux 3.5, glibc 2.18)
TCP_REPAIR      nil     Repair mode (Linux 3.5, glibc 2.18)
TCP_REPAIR_OPTIONS      nil     Options for repair mode (Linux 3.5, glibc 2.18)
TCP_REPAIR_QUEUE        nil     Queue for repair mode (Linux 3.5, glibc 2.18)
TCP_THIN_DUPACK nil     Duplicated acknowledgments handling for thin-streams (Linux 2.6.34, glibc 2.18)
TCP_THIN_LINEAR_TIMEOUTS        nil     Linear timeouts for thin-streams (Linux 2.6.34, glibc 2.18)
TCP_TIMESTAMP   nil     TCP timestamp (Linux 3.9, glibc 2.18)
TCP_USER_TIMEOUT        nil     Max timeout before a TCP connection is aborted (Linux 2.6.37, glibc 2.18)

UDP_CORK        nil     Don't send partial frames (Linux 2.5.44, glibc 2.11)

EAI_ADDRFAMILY  nil     Address family for hostname not supported
EAI_AGAIN       nil     Temporary failure in name resolution
EAI_BADFLAGS    nil     Invalid flags
EAI_FAIL        nil     Non-recoverable failure in name resolution
EAI_FAMILY      nil     Address family not supported
EAI_MEMORY      nil     Memory allocation failure
EAI_NODATA      nil     No address associated with hostname
EAI_NONAME      nil     Hostname nor servname, or not known
EAI_OVERFLOW    nil     Argument buffer overflow
EAI_SERVICE     nil     Servname not supported for socket type
EAI_SOCKTYPE    nil     Socket type not supported
EAI_SYSTEM      nil     System error returned in errno
EAI_BADHINTS    nil     Invalid value for hints
EAI_PROTOCOL    nil     Resolved protocol is unknown
EAI_MAX nil     Maximum error code from getaddrinfo

AI_PASSIVE      nil     Get address to use with bind()
AI_CANONNAME    nil     Fill in the canonical name
AI_NUMERICHOST  nil     Prevent host name resolution
AI_NUMERICSERV  nil     Prevent service name resolution
AI_MASK nil     Valid flag mask for getaddrinfo (not for application use)
AI_ALL  nil     Allow all addresses
AI_V4MAPPED_CFG nil     Accept IPv4 mapped addresses if the kernel supports it
AI_ADDRCONFIG   nil     Accept only if any address is assigned
AI_V4MAPPED     nil     Accept IPv4-mapped IPv6 addresses
AI_DEFAULT      nil     Default flags for getaddrinfo

NI_MAXHOST      nil     Maximum length of a hostname
NI_MAXSERV      nil     Maximum length of a service name
NI_NOFQDN       nil     An FQDN is not required for local hosts, return only the local part
NI_NUMERICHOST  nil     Return a numeric address
NI_NAMEREQD     nil     A name is required
NI_NUMERICSERV  nil     Return the service name as a digit string
NI_DGRAM        nil     The service specified is a datagram service (looks up UDP ports)

SHUT_RD         0       Shut down the reading side of the socket
SHUT_WR         1       Shut down the writing side of the socket
SHUT_RDWR       2       Shut down the both sides of the socket

IPV6_JOIN_GROUP nil     Join a group membership
IPV6_LEAVE_GROUP        nil     Leave a group membership
IPV6_MULTICAST_HOPS     nil     IP6 multicast hops
IPV6_MULTICAST_IF       nil     IP6 multicast interface
IPV6_MULTICAST_LOOP     nil     IP6 multicast loopback
IPV6_UNICAST_HOPS       nil     IP6 unicast hops
IPV6_V6ONLY     nil     Only bind IPv6 with a wildcard bind
IPV6_CHECKSUM   nil     Checksum offset for raw sockets
IPV6_DONTFRAG   nil     Don't fragment packets
IPV6_DSTOPTS    nil     Destination option
IPV6_HOPLIMIT   nil     Hop limit
IPV6_HOPOPTS    nil     Hop-by-hop option
IPV6_NEXTHOP    nil     Next hop address
IPV6_PATHMTU    nil     Retrieve current path MTU
IPV6_PKTINFO    nil     Receive packet information with datagram
IPV6_RECVDSTOPTS        nil     Receive all IP6 options for response
IPV6_RECVHOPLIMIT       nil     Receive hop limit with datagram
IPV6_RECVHOPOPTS        nil     Receive hop-by-hop options
IPV6_RECVPKTINFO        nil     Receive destination IP address and incoming interface
IPV6_RECVRTHDR  nil     Receive routing header
IPV6_RECVTCLASS nil     Receive traffic class
IPV6_RTHDR      nil     Allows removal of sticky routing headers
IPV6_RTHDRDSTOPTS       nil     Allows removal of sticky destination options header
IPV6_RTHDR_TYPE_0       nil     Routing header type 0
IPV6_RECVPATHMTU        nil     Receive current path MTU with datagram
IPV6_TCLASS     nil     Specify the traffic class
IPV6_USE_MIN_MTU        nil     Use the minimum MTU size

INET_ADDRSTRLEN 16      Maximum length of an IPv4 address string
INET6_ADDRSTRLEN        46      Maximum length of an IPv6 address string
IFNAMSIZ        nil     Maximum interface name size
IF_NAMESIZE     nil     Maximum interface name size

SOMAXCONN       5       Maximum connection requests that may be queued for a socket

SCM_RIGHTS      nil     Access rights
SCM_TIMESTAMP   nil     Timestamp (timeval)
SCM_TIMESTAMPNS nil     Timespec (timespec)
SCM_TIMESTAMPING        nil     Timestamp (timespec list) (Linux 2.6.30)
SCM_BINTIME     nil     Timestamp (bintime)
SCM_CREDENTIALS nil     The sender's credentials
SCM_CREDS       nil     Process credentials
SCM_UCRED       nil     User credentials
SCM_WIFI_STATUS nil     Wifi status (Linux 3.3)

LOCAL_PEERCRED  nil     Retrieve peer credentials
LOCAL_CREDS     nil     Pass credentials to receiver
LOCAL_CONNWAIT  nil     Connect blocks until accepted

IFF_802_1Q_VLAN      nil 802.1Q VLAN device
IFF_ALLMULTI         nil receive all multicast packets
IFF_ALTPHYS          nil use alternate physical connection
IFF_AUTOMEDIA        nil auto media select active
IFF_BONDING          nil bonding master or slave
IFF_BRIDGE_PORT      nil device used as bridge port
IFF_BROADCAST        nil broadcast address valid
IFF_CANTCONFIG       nil unconfigurable using ioctl(2)
IFF_DEBUG            nil turn on debugging
IFF_DISABLE_NETPOLL  nil disable netpoll at run-time
IFF_DONT_BRIDGE      nil disallow bridging this ether dev
IFF_DORMANT          nil driver signals dormant
IFF_DRV_OACTIVE      nil tx hardware queue is full
IFF_DRV_RUNNING      nil resources allocated
IFF_DYING            nil interface is winding down
IFF_DYNAMIC          nil dialup device with changing addresses
IFF_EBRIDGE          nil ethernet bridging device
IFF_ECHO             nil echo sent packets
IFF_ISATAP           nil ISATAP interface (RFC4214)
IFF_LINK0            nil per link layer defined bit 0
IFF_LINK1            nil per link layer defined bit 1
IFF_LINK2            nil per link layer defined bit 2
IFF_LIVE_ADDR_CHANGE nil hardware address change when it's running
IFF_LOOPBACK         nil loopback net
IFF_LOWER_UP         nil driver signals L1 up
IFF_MACVLAN_PORT     nil device used as macvlan port
IFF_MASTER           nil master of a load balancer
IFF_MASTER_8023AD    nil bonding master, 802.3ad.
IFF_MASTER_ALB       nil bonding master, balance-alb.
IFF_MASTER_ARPMON    nil bonding master, ARP mon in use
IFF_MONITOR          nil user-requested monitor mode
IFF_MULTICAST        nil supports multicast
IFF_NOARP            nil no address resolution protocol
IFF_NOTRAILERS       nil avoid use of trailers
IFF_OACTIVE          nil transmission in progress
IFF_OVS_DATAPATH     nil device used as Open vSwitch datapath port
IFF_POINTOPOINT      nil point-to-point link
IFF_PORTSEL          nil can set media type
IFF_PPROMISC         nil user-requested promisc mode
IFF_PROMISC          nil receive all packets
IFF_RENAMING         nil interface is being renamed
IFF_ROUTE            nil routing entry installed
IFF_RUNNING          nil resources allocated
IFF_SIMPLEX          nil can't hear own transmissions
IFF_SLAVE            nil slave of a load balancer
IFF_SLAVE_INACTIVE   nil bonding slave not the curr. active
IFF_SLAVE_NEEDARP    nil need ARPs for validation
IFF_SMART            nil interface manages own routes
IFF_STATICARP        nil static ARP
IFF_SUPP_NOFCS       nil sending custom FCS
IFF_TEAM_PORT        nil used as team port
IFF_TX_SKB_SHARING   nil sharing skbs on transmit
IFF_UNICAST_FLT      nil unicast filtering
IFF_UP               nil interface is up
IFF_WAN_HDLC         nil WAN HDLC device
IFF_XMIT_DST_RELEASE nil dev_hard_start_xmit() is allowed to release skb->dst
IFF_VOLATILE         nil volatile flags
IFF_CANTCHANGE       nil flags not changeable