Browse Source

* more android fixes for sockets unit, mantis #25528

git-svn-id: trunk@26480 -
marco 11 years ago
parent
commit
373e450dbc

+ 2 - 0
.gitattributes

@@ -6510,6 +6510,8 @@ packages/rtl-extra/fpmake.pp svneol=native#text/plain
 packages/rtl-extra/src/aix/osdefs.inc svneol=native#text/plain
 packages/rtl-extra/src/aix/unxsockh.inc svneol=native#text/plain
 packages/rtl-extra/src/android/osdefs.inc svneol=native#text/plain
+packages/rtl-extra/src/android/unixsock.inc svneol=native#text/plain
+packages/rtl-extra/src/android/unxsockh.inc svneol=native#text/plain
 packages/rtl-extra/src/beos/osdefs.inc svneol=native#text/plain
 packages/rtl-extra/src/beos/unixsock.inc svneol=native#text/plain
 packages/rtl-extra/src/beos/unxsockh.inc svneol=native#text/plain

+ 239 - 0
packages/rtl-extra/src/android/unixsock.inc

@@ -0,0 +1,239 @@
+{
+   This file is part of the Free Pascal run time library.
+   (c) 2004 by Marco van de Voort
+   member of the Free Pascal development team.
+
+   See the file COPYING.FPC, included in this distribution,
+   for details about the copyright.
+
+   socket call implementations for Linux
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY;without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+{$if not defined(cpux86_64) and not defined(NO_SYSCALL_SOCKETCALL)}
+  {$define NEED_SOCKETCALL}
+{$endif}
+
+{******************************************************************************
+                          Basic Socket Functions
+******************************************************************************}
+
+{$ifdef NEED_SOCKETCALL}
+
+Const
+  {
+    Arguments to the Linux Kernel system call for sockets. All
+    Socket Connected calls go through the same system call,
+    with an extra argument to determine what action to take.
+  }
+  Socket_Sys_SOCKET      = 1;
+  Socket_Sys_BIND        = 2;
+  Socket_Sys_CONNECT     = 3;
+  Socket_Sys_LISTEN      = 4;
+  Socket_Sys_ACCEPT      = 5;
+  Socket_Sys_GETSOCKNAME = 6;
+  Socket_Sys_GETPEERNAME = 7;
+  Socket_Sys_SOCKETPAIR  = 8;
+  Socket_Sys_SEND        = 9;
+  Socket_Sys_RECV        = 10;
+  Socket_Sys_SENDTO      = 11;
+  Socket_Sys_RECVFROM    = 12;
+  Socket_Sys_SHUTDOWN    = 13;
+  Socket_Sys_SETSOCKOPT  = 14;
+  Socket_Sys_GETSOCKOPT  = 15;
+  Socket_Sys_SENDMSG     = 16;
+  Socket_Sys_RECVMSG     = 17;
+
+
+Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:TSysParam):cint; inline;
+var
+  Args:array[1..6] of TSysParam;
+begin
+  args[1]:=a1;
+  args[2]:=a2;
+  args[3]:=a3;
+  args[4]:=a4;
+  args[5]:=a5;
+  args[6]:=a6;
+  SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,TSysParam(@args));
+  internal_socketerror:=fpgeterrno;
+end;
+
+
+function SocketCall(SockCallNr,a1,a2,a3:TSysParam):cint;inline;
+begin
+  SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
+end;
+
+function  fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
+begin
+  fpSocket:=SocketCall(Socket_Sys_socket,Domain,xtype,Protocol);
+end;
+
+function  fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
+begin
+  fpSend:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,0,0);
+end;
+
+function  fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
+begin
+  fpSendto:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
+end;
+
+function  fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
+begin
+  fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);
+end;
+
+function  fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
+begin
+  fpRecvFrom:=SocketCall(Socket_Sys_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
+end;
+
+function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
+begin
+  fpBind:=SocketCall(Socket_Sys_Bind,S,TSysParam(addrx),addrlen);
+end;
+
+function  fplisten (s:cint; backlog : cint):cint;
+begin
+  fpListen:=SocketCall(Socket_Sys_Listen,S,backlog,0);
+end;
+
+function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
+begin
+  fpAccept:=SocketCall(Socket_Sys_accept,S,TSysParam(addrx),TSysParam(addrlen));
+end;
+
+function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint;
+begin
+  fpConnect:=SocketCall(Socket_Sys_connect,S,TSysParam(name),namelen);
+end;
+
+function  fpshutdown (s:cint; how:cint):cint;
+begin
+  fpShutDown:=SocketCall(Socket_Sys_shutdown,S,how,0);
+end;
+
+function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
+begin
+  fpGetSockName:=SocketCall(Socket_Sys_GetSockName,S,TSysParam(name),TSysParam(namelen));
+end;
+
+function  fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
+begin
+  fpGetPeerName:=SocketCall(Socket_Sys_GetPeerName,S,TSysParam(name),TSysParam(namelen));
+end;
+
+function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
+begin
+  fpSetSockOpt:=SocketCall(Socket_Sys_SetSockOpt,S,level,optname,TSysParam(optval),optlen,0);
+end;
+
+function  fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
+begin
+  fpGetSockOpt:=SocketCall(Socket_Sys_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen),0);
+end;
+
+function  fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
+begin
+  fpSocketPair:=SocketCall(Socket_Sys_SocketPair,d,xtype,protocol,TSysParam(sv),0,0);
+end;
+
+{$else NEED_SOCKETCALL}
+
+function  fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
+begin
+  fpSocket:=do_syscall(syscall_nr_socket,Domain,xtype,Protocol);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
+begin
+  fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
+begin
+  fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
+begin
+  fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
+begin
+  fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
+begin
+  fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fplisten (s:cint; backlog : cint):cint;
+begin
+  fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
+begin
+  fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpconnect (s:cint; name  : psockaddr; namelen : tsocklen):cint;
+begin
+  fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpshutdown (s:cint; how:cint):cint;
+begin
+  fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpgetsockname (s:cint; name  : psockaddr; namelen : psocklen):cint;
+begin
+  fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpgetpeername (s:cint; name  : psockaddr; namelen : psocklen):cint;
+begin
+  fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpsetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
+begin
+  fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpgetsockopt  (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
+begin
+  fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
+  internal_socketerror:=fpgeterrno;
+end;
+
+function  fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
+begin
+  fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
+  internal_socketerror:=fpgeterrno;
+end;
+
+{$endif NEED_do_syscall}
+

+ 345 - 0
packages/rtl-extra/src/android/unxsockh.inc

@@ -0,0 +1,345 @@
+{
+   This file is part of the Free Pascal run time library.
+   (c) 2000-2003 by Marco van de Voort
+   member of the Free Pascal development team.
+
+   See the file COPYING.FPC, included in this distribution,
+   for details about the copyright.
+
+   socket call implementations for FreeBSD
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY;without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+Const
+{* Supported address families. *}
+  AF_UNSPEC     = 0;
+  AF_UNIX       = 1;     { Unix domain sockets          }
+  AF_LOCAL      = 1;     { POSIX name for AF_UNIX       }
+  AF_INET       = 2;     { Internet IP Protocol         }
+  AF_AX25       = 3;     { Amateur Radio AX.25          }
+  AF_IPX        = 4;     { Novell IPX                   }
+  AF_APPLETALK  = 5;     { AppleTalk DDP                }
+  AF_NETROM     = 6;     { Amateur Radio NET/ROM        }
+  AF_BRIDGE     = 7;     { Multiprotocol bridge         }
+  AF_ATMPVC     = 8;     { ATM PVCs                     }
+  AF_X25        = 9;     { Reserved for X.25 project    }
+  AF_INET6      = 10;    { IP version 6                 }
+  AF_ROSE       = 11;    { Amateur Radio X.25 PLP       }
+  AF_DECnet     = 12;    { Reserved for DECnet project  }
+  AF_NETBEUI    = 13;    { Reserved for 802.2LLC project}
+  AF_SECURITY   = 14;    { Security callback pseudo AF }
+  AF_KEY        = 15;    { PF_KEY key management API }
+  AF_NETLINK    = 16;
+  AF_ROUTE      = AF_NETLINK; { Alias to emulate 4.4BSD }
+  AF_PACKET     = 17;    { Packet family                }
+  AF_ASH        = 18;    { Ash                          }
+  AF_ECONET     = 19;    { Acorn Econet                 }
+  AF_ATMSVC     = 20;    { ATM SVCs                     }
+  AF_SNA        = 22;	 { Linux SNA Project (nutters!) }
+  AF_IRDA       = 23;    { IRDA sockets                 }
+  AF_PPPOX	= 24;    { PPPoX sockets                }
+  AF_WANPIPE    = 25;    { Wanpipe API Sockets }
+  AF_LLC        = 26;    { Linux LLC                    }
+  AF_TIPC       = 30;    { TIPC sockets                 }
+  AF_BLUETOOTH  = 31;    { Bluetooth sockets            }
+  AF_MAX        = 32;    { For now.. }
+  
+  SOCK_MAXADDRLEN = 255;             { longest possible addresses }
+
+{
+* Protocol families, same as address families for now.
+}
+
+  PF_UNSPEC     = AF_UNSPEC;
+  PF_UNIX       = AF_UNIX;
+  PF_LOCAL      = AF_LOCAL;
+  PF_INET       = AF_INET;
+  PF_AX25       = AF_AX25;
+  PF_IPX        = AF_IPX;
+  PF_APPLETALK  = AF_APPLETALK;
+  PF_NETROM     = AF_NETROM;
+  PF_BRIDGE     = AF_BRIDGE;
+  PF_ATMPVC     = AF_ATMPVC;
+  PF_X25        = AF_X25;
+  PF_INET6      = AF_INET6;
+  PF_ROSE       = AF_ROSE;
+  PF_DECnet     = AF_DECnet;
+  PF_NETBEUI    = AF_NETBEUI;
+  PF_SECURITY   = AF_SECURITY;
+  PF_KEY        = AF_KEY;
+  PF_NETLINK    = AF_NETLINK;
+  PF_ROUTE      = AF_ROUTE;
+  PF_PACKET     = AF_PACKET;
+  PF_ASH        = AF_ASH;
+  PF_ECONET     = AF_ECONET;
+  PF_ATMSVC     = AF_ATMSVC;
+  PF_SNA        = AF_SNA;
+  PF_IRDA       = AF_IRDA;
+  PF_PPPOX	= AF_PPPOX;
+  PF_WANPIPE    = AF_WANPIPE;
+  PF_LLC        = AF_LLC;
+  PF_TIPC       = AF_TIPC;
+  PF_BLUETOOTH  = AF_BLUETOOTH;
+  PF_MAX        = AF_MAX;
+
+
+{ Maximum queue length specifiable by listen.  }
+  SOMAXCONN     = 128;
+
+{ For setsockoptions(2) }
+         SOL_SOCKET  =   1;
+         SO_DEBUG    =   1;
+         SO_REUSEADDR=   2;
+         SO_TYPE     =   3;
+         SO_ERROR    =   4;
+         SO_DONTROUTE=   5;
+         SO_BROADCAST=   6;
+         SO_SNDBUF   =   7;
+         SO_RCVBUF   =   8;
+         SO_KEEPALIVE=   9;
+         SO_OOBINLINE=   10;
+         SO_NO_CHECK =   11;
+         SO_PRIORITY =   12;
+         SO_LINGER   =   13;
+         SO_BSDCOMPAT=   14;
+{ To add :         SO_REUSEPORT 15 }
+         SO_PASSCRED=    16;
+         SO_PEERCRED=    17;
+         SO_RCVLOWAT=    18;
+         SO_SNDLOWAT=    19;
+         SO_RCVTIMEO=    20;
+         SO_SNDTIMEO=    21;
+
+{ Security levels - as per NRL IPv6 - don't actually do anything }
+
+         SO_SECURITY_AUTHENTICATION      =   22;
+         SO_SECURITY_ENCRYPTION_TRANSPORT=   23;
+         SO_SECURITY_ENCRYPTION_NETWORK  =   24;
+
+         SO_BINDTODEVICE=   25;
+
+{ Socket filtering }
+
+         SO_ATTACH_FILTER=  26;
+         SO_DETACH_FILTER=  27;
+         SO_PEERNAME     =  28;
+         SO_TIMESTAMP    = 29;
+         SCM_TIMESTAMP   = SO_TIMESTAMP;
+         SO_ACCEPTCONN   = 30;
+
+// Following from kernel 2.6.14-1.1637_FC4
+
+        SHUT_RD          = 0;             { shut down the reading side }
+        SHUT_WR          = 1;             { shut down the writing side }
+        SHUT_RDWR        = 2;             { shut down both sides }
+
+//from /usr/include/netinet/in.h
+
+        IPPROTO_IP       = 0;       { Dummy protocol for TCP.  }
+        IPPROTO_HOPOPTS  = 0;      { IPv6 Hop-by-Hop options.  }
+
+        IPPROTO_ICMP     = 1;       { Internet Control Message Protocol.  }
+        IPPROTO_IGMP     = 2;       { Internet Group Management Protocol. }
+        IPPROTO_IPIP     = 4;       { IPIP tunnels (older KA9Q tunnels use 94).  }
+        IPPROTO_TCP      = 6;       { Transmission Control Protocol.  }
+        IPPROTO_EGP      = 8;       { Exterior Gateway Protocol.  }
+
+        IPPROTO_PUP      = 12;       { PUP protocol.  }
+        IPPROTO_UDP      = 17;       { User Datagram Protocol.  }
+        IPPROTO_IDP      = 22;       { XNS IDP protocol.  }
+        IPPROTO_TP       = 29;       { SO Transport Protocol Class 4.  }
+        IPPROTO_IPV6     = 41;     { IPv6 header.  }
+
+         IPPROTO_ROUTING = 43;  { IPv6 routing header.  }
+         IPPROTO_FRAGMENT = 44; { IPv6 fragmentation header.  }
+         IPPROTO_RSVP    = 46;       { Reservation Protocol.  }
+         IPPROTO_GRE     = 47;       { General Routing Encapsulation.  }
+         IPPROTO_ESP     = 50;     { encapsulating security payload.  }
+         IPPROTO_AH      = 51;     { authentication header.  }
+         IPPROTO_ICMPV6  = 58;     { ICMPv6.  }
+         IPPROTO_NONE    = 59;     { IPv6 no next header.  }
+         IPPROTO_DSTOPTS = 60;     { IPv6 destination options.  }
+         IPPROTO_MTP     = 92;       { Multicast Transport Protocol.  }
+         IPPROTO_ENCAP   = 98;       { Encapsulation Header.  }
+         IPPROTO_PIM     = 103;       { Protocol Independent Multicast.  }
+         IPPROTO_COMP    = 108;       { Compression Header Protocol.  }
+         IPPROTO_SCTP    = 132;       { Stream Control Transmission Protocol.  }
+         IPPROTO_RAW     = 255;       { Raw IP packets.  }
+         IPPROTO_MAX     = 255;
+//from /usr/include/bits/in.h
+{ Options for use with getsockopt' and setsockopt' at the IP level.
+   The first word in the comment at the right is the data type used;
+   "bool" means a boolean value stored in an int'.  }
+
+        IP_OPTIONS              = 4;               { ip_opts; IP per-packet options.  }
+        IP_HDRINCL              = 3;               { int; Header is included with data.  }
+        IP_TOS                  = 1;               { int; IP type of service and precedence.  }
+        IP_TTL                  = 2;               { int; IP time to live.  }
+        IP_RECVOPTS             = 6;               { bool; Receive all IP options w/datagram.  }
+{ For BSD compatibility.  }
+        IP_RETOPTS              = 7;               { ip_opts; Set/get IP per-packet options.  }
+        IP_RECVRETOPTS          = IP_RETOPTS;      { bool; Receive IP options for response.  }
+
+        IP_MULTICAST_IF         = 32;                { in_addr; set/get IP multicast i/f }
+        IP_MULTICAST_TTL        = 33;               { u_char; set/get IP multicast ttl }
+        IP_MULTICAST_LOOP       = 34;              { i_char; set/get IP multicast loopback }
+        IP_ADD_MEMBERSHIP       = 35;               { ip_mreq; add an IP group membership }
+        IP_DROP_MEMBERSHIP      = 36;            { ip_mreq; drop an IP group membership }
+        IP_UNBLOCK_SOURCE       = 37;                 { ip_mreq_source: unblock data from source }
+        IP_BLOCK_SOURCE         = 38;              { ip_mreq_source: block data from source }
+        IP_ADD_SOURCE_MEMBERSHIP = 39;             { ip_mreq_source: join source group }
+        IP_DROP_SOURCE_MEMBERSHIP = 40;            { ip_mreq_source: leave source group }
+        IP_MSFILTER             = 41;
+        MCAST_JOIN_GROUP        = 42;    { group_req: join any-source group }
+        MCAST_BLOCK_SOURCE      = 43;    { group_source_req: block from given group }
+        MCAST_UNBLOCK_SOURCE    = 44;    { group_source_req: unblock from given group}
+        MCAST_LEAVE_GROUP       = 45;    { group_req: leave any-source group }
+        MCAST_JOIN_SOURCE_GROUP = 46;   { group_source_req: join source-spec gr }
+        MCAST_LEAVE_SOURCE_GROUP = 47;  { group_source_req: leave source-spec gr}
+        MCAST_MSFILTER          = 48;
+
+        MCAST_EXCLUDE           = 0;
+        MCAST_INCLUDE           = 1;
+
+        IP_ROUTER_ALERT         = 5;    { bool }
+        IP_PKTINFO              = 8;    { bool }
+        IP_PKTOPTIONS           = 9;
+        IP_PMTUDISC             = 10;    { obsolete name? }
+        IP_MTU_DISCOVER         = 10;   { int; see below }
+        IP_RECVERR              = 11;    { bool }
+        IP_RECVTTL              = 12;   { bool }
+        IP_RECVTOS              = 13;    { bool }
+
+
+{ IP_MTU_DISCOVER arguments.  }
+        IP_PMTUDISC_DONT        = 0;    { Never send DF frames.  }
+        IP_PMTUDISC_WANT        = 1;    { Use per route hints.  }
+        IP_PMTUDISC_DO          = 2;    { Always DF.  }
+
+{ To select the IP level.  }
+        SOL_IP                  = 0;
+
+        IP_DEFAULT_MULTICAST_TTL = 1;
+        IP_DEFAULT_MULTICAST_LOOP = 1;
+        IP_MAX_MEMBERSHIPS       = 20;
+
+
+{  Options for use with getsockopt' and setsockopt' at the IPv6 level.
+   The first word in the comment at the right is the data type used;
+   "bool" means a boolean value stored in an int'.  }
+        IPV6_ADDRFORM         = 1;
+        IPV6_PKTINFO             = 2;
+        IPV6_HOPOPTS             = 3;
+        IPV6_DSTOPTS             = 4;
+        IPV6_RTHDR          = 5;
+        IPV6_RXSRCRT             = IPV6_RTHDR;
+        //this may be an old name, I couldn't find it in my include files but
+        //I found it with google.  It may have been depreciated because I only
+        //saw it in earlier files.
+        IPV6_PKTOPTIONS         = 6;
+        IPV6_CHECKSUM            = 7;
+        IPV6_HOPLIMIT            = 8;
+
+        SCM_SRCRT                = IPV6_RXSRCRT;
+
+        IPV6_NEXTHOP         = 9;
+        IPV6_AUTHHDR         = 10;
+        IPV6_UNICAST_HOPS        = 16;
+        IPV6_MULTICAST_IF     = 17;
+        IPV6_MULTICAST_HOPS     = 18;
+        IPV6_MULTICAST_LOOP      = 19;
+        IPV6_JOIN_GROUP             = 20;
+        IPV6_LEAVE_GROUP     = 21;
+        IPV6_ROUTER_ALERT     = 22;
+        IPV6_MTU_DISCOVER     = 23;
+        IPV6_MTU         = 24;
+        IPV6_RECVERR         = 25;
+        IPV6_V6ONLY         = 26;
+        IPV6_JOIN_ANYCAST     = 27;
+        IPV6_LEAVE_ANYCAST     = 28;
+        IPV6_IPSEC_POLICY     = 34;
+        IPV6_XFRM_POLICY     = 35;
+
+{ Obsolete synonyms for the above.  }
+        IPV6_ADD_MEMBERSHIP     = IPV6_JOIN_GROUP;
+        IPV6_DROP_MEMBERSHIP     = IPV6_LEAVE_GROUP;
+        IPV6_RXHOPOPTS         = IPV6_HOPOPTS;
+        IPV6_RXDSTOPTS           = IPV6_DSTOPTS;
+
+{ IPV6_MTU_DISCOVER values.  }
+        IPV6_PMTUDISC_DONT     = 0;    { Never send DF frames.  }
+        IPV6_PMTUDISC_WANT      = 1;    { Use per route hints.  }
+        IPV6_PMTUDISC_DO     = 2;    { Always DF.  }
+
+{ Socket level values for IPv6.  }
+        SOL_IPV6                 = 41;
+        SOL_ICMPV6               = 58;
+
+{ Routing header options for IPv6.  }
+        IPV6_RTHDR_LOOSE         = 0;   { Hop doesn't need to be neighbour. }
+        IPV6_RTHDR_STRICT     = 1;    { Hop must be a neighbour.  }
+
+        IPV6_RTHDR_TYPE_0        = 0;    { IPv6 Routing header type 0.  }
+        
+  { Flags for send, recv etc. }
+  MSG_OOB      = $0001;              { Process out-of-band data}
+  MSG_PEEK     = $0002;              { Peek at incoming messages }
+  MSG_DONTROUTE= $0004;              { Don't use local routing }
+  MSG_TRYHARD  = MSG_DONTROUTE;
+  MSG_CTRUNC   = $0008;              { Control data lost before delivery }
+  MSG_PROXY    = $0010;              { Supply or ask second address }
+  MSG_TRUNC    = $0020;
+  MSG_DONTWAIT = $0040;              { Non-blocking I/O }
+  MSG_EOR      = $0080;              { End of record }
+  MSG_WAITALL  = $0100;              { Wait for a full request }
+  MSG_FIN      = $0200;
+  MSG_SYN      = $0400;
+  MSG_CONFIRM  = $0800;              { Confirm path validity }
+  MSG_RST      = $1000;
+  MSG_ERRQUERE = $2000;              { Fetch message from error queue }
+  MSG_NOSIGNAL = $4000;              { Do not generate SIGPIPE }
+  MSG_MORE     = $8000;              { Sender will send more }
+  MSG_EOF      = MSG_FIN;
+  
+     TCP_NODELAY = 1;
+  { Limit MSS  }
+     TCP_MAXSEG = 2;
+  { Never send partially complete segments  }
+     TCP_CORK = 3;
+  { Start keeplives after this period  }
+     TCP_KEEPIDLE = 4;
+  { Interval between keepalives  }
+     TCP_KEEPINTVL = 5;
+  { Number of keepalives before death  }
+     TCP_KEEPCNT = 6;
+  { Number of SYN retransmits  }
+     TCP_SYNCNT = 7;
+  { Life time of orphaned FIN-WAIT-2 state  }
+     TCP_LINGER2 = 8;
+  { Wake up listener only when data arrive  }
+     TCP_DEFER_ACCEPT = 9;
+  { Bound advertised window  }
+     TCP_WINDOW_CLAMP = 10;
+  { Information about this connection.  }
+     TCP_INFO = 11;
+  { Block/reenable quick acks  }
+     TCP_QUICKACK = 12;
+  { Congestion control algorithm  }
+     TCP_CONGESTION = 13;
+  { TCP MD5 Signature (RFC2385)  }
+     TCP_MD5SIG = 14;
+  
+     UDP_CORK = 1;
+  { Set the socket to accept encapsulated packets  }
+     UDP_ENCAP = 100;
+  { UDP encapsulation types  }
+  { draft-ietf-ipsec-nat-t-ike-00/01  }
+     UDP_ENCAP_ESPINUDP_NON_IKE = 1;
+  { draft-ietf-ipsec-udp-encaps-06  }
+     UDP_ENCAP_ESPINUDP = 2;
+  { rfc2661  }
+     UDP_ENCAP_L2TPINUDP = 3;
+