Print this page
10522 Convert ipnat(7I) to mandoc

Split Close
Expand all
Collapse all
          --- old/usr/src/man/man7i/ipnat.7i
          +++ new/usr/src/man/man7i/ipnat.7i
   1      -'\" te
   2    1  .\" Copyright (c) 2008, Sun Microsystems, Inc.  All Rights Reserved
   3      -.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
   4      -.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
   5      -.\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
   6      -.TH IPNAT 7I "May 22, 2008"
   7      -.SH NAME
   8      -ipnat \- IP Filter/NAT module interface
   9      -.SH DESCRIPTION
  10      -.sp
  11      -.LP
  12      -The \fBipnat\fR device provides interfaction with the NAT features of the
  13      -Solaris IPFilter.
  14      -.SH APPLICATION PROGRAMMING INTERFACE
  15      -.sp
  16      -.LP
        2 +.\" Copyright (c) 2017, Joyent, Inc.
        3 +.\" The contents of this file are subject to the terms of the
        4 +.\" Common Development and Distribution License (the "License").
        5 +.\" You may not use this file except in compliance with the License.
        6 +.\"
        7 +.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
        8 +.\" or http://www.opensolaris.org/os/licensing.
        9 +.\" See the License for the specific language governing permissions
       10 +.\" and limitations under the License.
       11 +.\"
       12 +.\" When distributing Covered Code, include this CDDL HEADER in each
       13 +.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
       14 +.\" If applicable, add the following below this CDDL HEADER, with the
       15 +.\" fields enclosed by brackets "[]" replaced with your own identifying
       16 +.\" information: Portions Copyright [yyyy] [name of copyright owner]
       17 +.Dd October 23, 2017
       18 +.Dt IPNAT 7I
       19 +.Os
       20 +.Sh NAME
       21 +.Nm ipnat
       22 +.Nd IP Filter/NAT module interface
       23 +.Sh DESCRIPTION
       24 +The
       25 +.Sy ipnat
       26 +device provides interfaction with the NAT features of the Solaris IPFilter.
       27 +.Sh APPLICATION PROGRAMMING INTERFACE
  17   28  The NAT features programming model is a component of the Solaris IP Filter and
  18      -is accessed via the NAT device file \fB/dev/ipnat\fR.  Opening the device for
       29 +is accessed via the NAT device file
       30 +.Pa /dev/ipnat .
       31 +Opening the device for
  19   32  reading or writing determines which ioctl calls can be successfully made.
  20      -.SH IOCTLS
  21      -.sp
  22      -.LP
  23      -The caller must construct a \fBipfobj\fR structure when issuing a
  24      -\fBSIOCGNATL\fR or \fBSIOCSTPUT\fR. The \fBipfobj\fR structure is then passed
  25      -to the ioctl call and is filled out with ipfo_type set to \fBIPFOBJ_value\fR.
  26      -\fBIPFOBJ_ value\fR provides a matching name for the structure, while ipfo_size
  27      -is set to the total size of the structure being passed and ipfo_ptr is set to
  28      -the structure address. The ipfo_rev structure should be set to the current
  29      -value of IPFILTER_VERSION, while ipfo_offset and ipfo_xxxpad should be set to
  30      -0.
  31      -.sp
  32      -.in +2
  33      -.nf
       33 +.Sh IOCTLS
       34 +The caller must construct a
       35 +.Vt ipfobj
       36 +structure when issuing a
       37 +.Sy SIOCGNATL
       38 +or
       39 +SIOCSTPUT
       40 +ioctl.
       41 +The
       42 +.Vt ipfobj
       43 +structure is then passed
       44 +to the ioctl call and is filled out with
       45 +.Fa ipfo_type
       46 +set to
       47 +.Dv IPFOBJ_ Ns value .
       48 +.Dv IPFOBJ_ Ns value
       49 +provides a matching name for the structure, while
       50 +.Fa ipfo_size
       51 +is set to the total size of the structure being passed and
       52 +.Fa ipfo_ptr
       53 +is set to the structure address.
       54 +The
       55 +.Fa ipfo_rev
       56 +structure should be set to the current value of
       57 +.Dv IPFILTER_VERSION ,
       58 +while
       59 +.Fa ipfo_offset
       60 +and
       61 +.Fa ipfo_xxxpad
       62 +should be set to 0.
       63 +.Bd -literal -offset 2n
  34   64  /*
  35      -    * Structure used with SIOCGNATL/SIOCSTPUT.
  36      -    */
  37      -   /*
  38      -    * Object structure description.  For passing through in ioctls.
  39      -    */
  40      -   typedef struct  ipfobj  {
  41      -        u_32_t  ipfo_rev;         /* IPFilter version (IPFILTER_VERSION) */
  42      -        u_32_t  ipfo_size;        /* size of object at ipfo_ptr */
  43      -        void    *ipfo_ptr;        /* pointer to object */
  44      -        int     ipfo_type;        /* type of object being pointed to */
  45      -        int     ipfo_offset;      /* bytes from ipfo_ptr where to start */
  46      -        u_char  ipfo_xxxpad[32];  /* reserved for future use */
  47      -   } ipfobj_t;
       65 + * Structure used with SIOCGNATL/SIOCSTPUT.
       66 + */
  48   67  
  49      -   #define IPFILTER_VERSION        4010901 /* IPFilter version */
  50      -   #define IPFOBJ_NATSAVE          8       /* struct nat_save */
  51      -   #define IPFOBJ_NATLOOKUP        9       /* struct natlookup */
  52      -.fi
  53      -.in -2
       68 +/*
       69 + * Object structure description.  For passing through in ioctls.
       70 + */
       71 +typedef struct  ipfobj  {
       72 +     u_32_t  ipfo_rev;         /* IPFilter version (IPFILTER_VERSION) */
       73 +     u_32_t  ipfo_size;        /* size of object at ipfo_ptr */
       74 +     void    *ipfo_ptr;        /* pointer to object */
       75 +     int     ipfo_type;        /* type of object being pointed to */
       76 +     int     ipfo_offset;      /* bytes from ipfo_ptr where to start */
       77 +     u_char  ipfo_xxxpad[32];  /* reserved for future use */
       78 +} ipfobj_t;
  54   79  
  55      -.sp
  56      -.LP
  57      -The following ioctl() calls may be used to manipulate the ipnat sub-system
  58      -inside of ipf. Note that the ipnat driver only accept calls from applications
  59      -using the same data model as the kernel. In other words, 64-bit kernels can
  60      -only accept calls from 64-bit applications. Calls from 32-bit applications fail
  61      -with \fBEINVAL\fR.
  62      -.sp
  63      -.ne 2
  64      -.na
  65      -\fB\fBSIOCSTLCK\fR\fR
  66      -.ad
  67      -.RS 13n
       80 +#define IPFILTER_VERSION        4010901 /* IPFilter version */
       81 +#define IPFOBJ_NATSAVE          8       /* struct nat_save */
       82 +#define IPFOBJ_NATLOOKUP        9       /* struct natlookup */
       83 +.Ed
       84 +.Pp
       85 +The following
       86 +.Xr ioctl 2
       87 +calls may be used to manipulate the ipnat sub-system inside of ipf.
       88 +Note that the ipnat driver only accept calls from applications
       89 +using the same data model as the kernel.
       90 +In other words, 64-bit kernels can only accept calls from 64-bit applications.
       91 +Calls from 32-bit applications fail
       92 +with
       93 +.Er EINVAL .
       94 +.Bl -tag -width SIOCSTLCK
       95 +.It Dv SIOCSTLCK
  68   96  Set or clear the NAT lock to prevent table updates attributable to packet
  69   97  flow-through.
  70      -.RE
  71      -
  72      -.sp
  73      -.ne 2
  74      -.na
  75      -\fB\fBSIOCGNATL\fR\fR
  76      -.ad
  77      -.RS 13n
       98 +.It Dv SIOCGNATL
  78   99  Search the NAT table for the rdr entry that matches the fields in the natlookup
  79      -structure. The caller must populate the structure with the address/port
  80      -information of the accepted TCP connection (nl_inip, nl_inport)  and the
  81      -address/port information of the peer (nl_outip, nl_outport). The nl_flags field
  82      -must have the IPN_TCP option set. All other fields must be set to  0. If the
  83      -call  succeeds, nl_realip  and nl_realport are set to the  real destination
  84      -address and port, respectively. The nl_inport and  nl_outport fields must be in
  85      -host byte order.
  86      -.sp
  87      -If \fBIPN_FINDFORWARD\fR is set in nl_flags, a check is made to see if it is
      100 +structure.
      101 +The caller must populate the structure with the address/port
      102 +information of the accepted TCP connection
      103 +.Pq Fa nl_inip , Fa nl_inport
      104 +and the
      105 +address/port information of the peer
      106 +.Pq Fa nl_outip , Fa nl_outport .
      107 +The
      108 +.Fa nl_flags
      109 +field must have the
      110 +.Dv IPN_TCP
      111 +option set.
      112 +All other fields must be set to 0.
      113 +If the call succeeds,
      114 +.Fa nl_realip
      115 +and
      116 +.Fa nl_realport
      117 +are set to the real destination address and port, respectively.
      118 +The
      119 +.Fa nl_inport
      120 +and
      121 +.Fa nl_outport
      122 +fields must be in host byte order.
      123 +If
      124 +.Dv IPN_FINDFORWARD
      125 +is set in
      126 +.Fa nl_flags ,
      127 +a check is made to see if it is
  88  128  possible to create an outgoing NAT session by checking if a packet coming from
  89      -(nl_realip,nl_realport) and destined for (nl_outip,nl_outport) can be
  90      -translated.  If translation is possible, the flag remains set, otherwise it is
      129 +.Pq Fa nl_realip , Fa nl_realport
      130 +and destined for
      131 +.Pq Fa nl_outip , Fa nl_outport
      132 +can be translated.
      133 +If translation is possible, the flag remains set, otherwise it is
  91  134  cleared in the structure returned to the caller.
  92      -.sp
  93      -.in +2
  94      -.nf
  95      -     /*
  96      -      * Structure used with SIOCGNATL.
  97      -      */
  98      -     typedef struct natlookup {
  99      -          i6addr_t  nl_inipaddr;
 100      -          i6addr_t  nl_outipaddr;
 101      -          i6addr_t  nl_realipaddr;
 102      -          int       nl_v;
 103      -          int       nl_flags;
 104      -          u_short   nl_inport;
 105      -          u_short   nl_outport;
 106      -          u_short   nl_realport;
 107      -     } natlookup_t
      135 +.Bd -literal -offset indent
      136 +/*
      137 + * Structure used with SIOCGNATL.
      138 + */
      139 +typedef struct natlookup {
      140 +     i6addr_t  nl_inipaddr;
      141 +     i6addr_t  nl_outipaddr;
      142 +     i6addr_t  nl_realipaddr;
      143 +     int       nl_v;
      144 +     int       nl_flags;
      145 +     u_short   nl_inport;
      146 +     u_short   nl_outport;
      147 +     u_short   nl_realport;
      148 +} natlookup_t
 108  149  
 109      -    #define nl_inip       nl_inipaddr.in4
 110      -    #define nl_outip      nl_outipaddr.in4
 111      -    #define nl_realip     nl_realipaddr.in4
 112      -    #define nl_inip6      nl_inipaddr.in6
 113      -    #define nl_outip6     nl_outipaddr.in6
 114      -    #define nl_realip6    nl_realipaddr.in6
      150 +#define nl_inip       nl_inipaddr.in4
      151 +#define nl_outip      nl_outipaddr.in4
      152 +#define nl_realip     nl_realipaddr.in4
      153 +#define nl_inip6      nl_inipaddr.in6
      154 +#define nl_outip6     nl_outipaddr.in6
      155 +#define nl_realip6    nl_realipaddr.in6
 115  156  
 116      -     /*
 117      -      * Accepted values for nl_flags
 118      -      */
 119      -     #define   IPN_TCP         0x00001
 120      -     #define   IPN_FINDFORWARD 0x400000
 121      -.fi
 122      -.in -2
 123      -
 124      -.RE
 125      -
 126      -.sp
 127      -.ne 2
 128      -.na
 129      -\fB\fBSIOCSTPUT\fR\fR
 130      -.ad
 131      -.RS 13n
 132      -Move a NAT mapping  structure from user space into the kernel. This ioctl is
 133      -used by \fBipfs\fR(1M) to restore NAT sessions saved in
 134      -\fB/var/db/ipf/ipnat.ipf\fR. The nat_save structure must have its ipn_nat and
 135      -ipn_ipnat structures filled out correctly. Fields not assigned a value must be
 136      -initialised to  0. All pointer fields are adjusted, as appropriate, once the
      157 +/*
      158 + * Accepted values for nl_flags
      159 + */
      160 +#define   IPN_TCP         0x00001
      161 +#define   IPN_FINDFORWARD 0x400000
      162 +.Ed
      163 +.It Dv SIOCSTPUT
      164 +Move a NAT mapping structure from user space into the kernel.
      165 +This ioctl is used by
      166 +.Xr ipfs 1M
      167 +to restore NAT sessions saved in
      168 +.Pa /var/db/ipf/ipnat.ipf .
      169 +The
      170 +.Vt nat_save
      171 +structure must have its
      172 +.Fa ipn_nat
      173 +and
      174 +.Fa ipn_ipnat
      175 +structures filled out correctly.
      176 +Fields not assigned a value must be initialised to 0.
      177 +All pointer fields are adjusted, as appropriate, once the
 137  178  structure is passed into the kernel and none are preserved.
 138      -.sp
      179 +.Pp
 139  180  To create a translation, the following fields must be set:
 140      -.br
 141      -.in +2
 142      -Interface name - The interface name on which the host is to be exited must be
 143      -set in nat_ifnames[0].
 144      -.in -2
 145      -.br
 146      -.in +2
 147      -Local IP address and port number - The connection's local IP address and port
 148      -number are stored in network byte order using  nat_inip/nat_inport.
 149      -.in -2
 150      -.br
 151      -.in +2
 152      -Destination address/port - The destination address/port  are stored in
 153      -nat_oip/nat_oport.
 154      -.in -2
 155      -.br
 156      -.in +2
 157      -Target address/port - The translation's target address/port is stored in
 158      -nat_outip/nat_outport.
 159      -.in -2
      181 +.\" Force item bodies to next line using 2n width
      182 +.Bl -tag -width 2n
      183 +.It "Interface name"
      184 +The interface name on which the host is to be exited must be
      185 +set in
      186 +.Fa nat_ifnames[0] .
      187 +.It "Local IP address and port number"
      188 +The connection's local IP address and port
      189 +number are stored in network byte order using
      190 +.Fa nat_inip Ns / Ns Fa nat_inport .
      191 +.It "Destination address/port"
      192 +The destination address/port are stored in
      193 +.Fa nat_oip Ns / Ns Fa nat_oport .
      194 +.It "Target address/port"
      195 +The translation's target address/port is stored in
      196 +.Fa nat_outip Ns / Ns Fa nat_outport .
      197 +.El
      198 +.Pp
 160  199  The caller must also precalculate the checksum adjustments necessary to
 161      -complete the translation and store those values in nat_sumd (delta required for
 162      -TCP  header) and nat_ipsumd (delta required for IP header).
 163      -.sp
 164      -.in +2
 165      -.nf
      200 +complete the translation and store those values in
      201 +.Fa nat_sumd
      202 +(delta required for TCP  header) and
      203 +.Fa nat_ipsumd
      204 +(delta required for IP header).
      205 +.Bd -literal -offset indent
 166  206  /*
 167      -      * Structures used with SIOCSTPUT.
 168      -      */
 169      -     typedef struct  nat_save    {
 170      -          void    *ipn_next;
 171      -          struct  nat     ipn_nat;
 172      -          struct  ipnat   ipn_ipnat;
 173      -          struct  frentry ipn_fr;
 174      -          int     ipn_dsize;
 175      -          char    ipn_data[4];
 176      -     } nat_save_t;
      207 + * Structures used with SIOCSTPUT.
      208 + */
      209 +typedef struct  nat_save {
      210 +     void            *ipn_next;
      211 +     struct  nat     ipn_nat;
      212 +     struct  ipnat   ipn_ipnat;
      213 +     struct  frentry ipn_fr;
      214 +     int             ipn_dsize;
      215 +     char            ipn_data[4];
      216 +} nat_save_t;
 177  217  
 178      -     typedef struct  nat     {
 179      -          ipfmutex_t      nat_lock;
 180      -          struct  nat     *nat_next;
 181      -          struct  nat     **nat_pnext;
 182      -          struct  nat     *nat_hnext[2];
 183      -          struct  nat     **nat_phnext[2];
 184      -          struct  hostmap *nat_hm;
 185      -          void            *nat_data;
 186      -          struct  nat     **nat_me;
 187      -          struct  ipstate *nat_state;
 188      -          struct  ap_session      *nat_aps;
 189      -          frentry_t       *nat_fr;
 190      -          struct  ipnat   *nat_ptr;
 191      -          void            *nat_ifps[2];
 192      -          void            *nat_sync;
 193      -          ipftqent_t      nat_tqe;
 194      -          u_32_t          nat_flags;
 195      -          u_32_t          nat_sumd[2];
 196      -          u_32_t          nat_ipsumd;
 197      -          u_32_t          nat_mssclamp;
 198      -          i6addr_t        nat_inip6;
 199      -          i6addr_t        nat_outip6;
 200      -          i6addr_t        nat_oip6;
 201      -          U_QUAD_T        nat_pkts[2];
 202      -          U_QUAD_T        nat_bytes[2];
 203      -          union   {
 204      -               udpinfo_t       nat_unu;
 205      -               tcpinfo_t       nat_unt;
 206      -               icmpinfo_t      nat_uni;
 207      -               greinfo_t       nat_ugre;
 208      -          } nat_un;
 209      -          u_short         nat_oport;
 210      -          u_short         nat_use;
 211      -          u_char          nat_p;
 212      -          int             nat_dir;
 213      -          int             nat_ref;
 214      -          int             nat_hv[2];
 215      -          char            nat_ifnames[2][LIFNAMSIZ];
 216      -          int             nat_rev;
 217      -                 int             nat_v;
 218      -     } nat_t;
      218 +typedef struct  nat {
      219 +     ipfmutex_t      nat_lock;
      220 +     struct  nat     *nat_next;
      221 +     struct  nat     **nat_pnext;
      222 +     struct  nat     *nat_hnext[2];
      223 +     struct  nat     **nat_phnext[2];
      224 +     struct  hostmap *nat_hm;
      225 +     void            *nat_data;
      226 +     struct  nat     **nat_me;
      227 +     struct  ipstate *nat_state;
      228 +     struct  ap_session      *nat_aps;
      229 +     frentry_t       *nat_fr;
      230 +     struct  ipnat   *nat_ptr;
      231 +     void            *nat_ifps[2];
      232 +     void            *nat_sync;
      233 +     ipftqent_t      nat_tqe;
      234 +     u_32_t          nat_flags;
      235 +     u_32_t          nat_sumd[2];
      236 +     u_32_t          nat_ipsumd;
      237 +     u_32_t          nat_mssclamp;
      238 +     i6addr_t        nat_inip6;
      239 +     i6addr_t        nat_outip6;
      240 +     i6addr_t        nat_oip6;
      241 +     U_QUAD_T        nat_pkts[2];
      242 +     U_QUAD_T        nat_bytes[2];
      243 +     union   {
      244 +          udpinfo_t       nat_unu;
      245 +          tcpinfo_t       nat_unt;
      246 +          icmpinfo_t      nat_uni;
      247 +          greinfo_t       nat_ugre;
      248 +     } nat_un;
      249 +     u_short         nat_oport;
      250 +     u_short         nat_use;
      251 +     u_char          nat_p;
      252 +     int             nat_dir;
      253 +     int             nat_ref;
      254 +     int             nat_hv[2];
      255 +     char            nat_ifnames[2][LIFNAMSIZ];
      256 +     int             nat_rev;
      257 +     int             nat_v;
      258 +} nat_t;
 219  259  
 220      -     #define nat_inip        nat_inip6.in4
 221      -     #define nat_outip       nat_outip6.in4
 222      -     #define nat_oip         nat_oip6.in4
 223      -     #define nat_inport      nat_un.nat_unt.ts_sport
 224      -     #define nat_outport     nat_un.nat_unt.ts_dport
 225      -     /*
 226      -      * Values for nat_dir
 227      -      */
 228      -     #define NAT_INBOUND     0
 229      -     #define NAT_OUTBOUND    1
 230      -     /*
 231      -      * Definitions for nat_flags
 232      -      */
 233      -     #define NAT_TCP         0x0001  /* IPN_TCP */
 234      -.fi
 235      -.in -2
 236      -
 237      -.RE
 238      -
 239      -.SH EXAMPLES
 240      -.sp
 241      -.LP
 242      -The following example shows how to prepare and use \fBSIOCSTPUT\fR to insert a
 243      -NAT session directly into the table. Note that the usual TCP/IP code is omitted
 244      -is this example.
 245      -.sp
 246      -.LP
 247      -In the code segment below, incoming_fd is the TCP connection file descriptor
 248      -that is accepted as part of the redirect process, while remote_fd is the
 249      -outgoing TCP connection to the remote server being translated back to  the
      260 +#define nat_inip        nat_inip6.in4
      261 +#define nat_outip       nat_outip6.in4
      262 +#define nat_oip         nat_oip6.in4
      263 +#define nat_inport      nat_un.nat_unt.ts_sport
      264 +#define nat_outport     nat_un.nat_unt.ts_dport
      265 +/*
      266 + * Values for nat_dir
      267 + */
      268 +#define NAT_INBOUND     0
      269 +#define NAT_OUTBOUND    1
      270 +/*
      271 + * Definitions for nat_flags
      272 + */
      273 +#define NAT_TCP         0x0001  /* IPN_TCP */
      274 +.Ed
      275 +.El
      276 +.Sh EXAMPLES
      277 +The following example shows how to prepare and use
      278 +.Fa SIOCSTPUT
      279 +to insert a NAT session directly into the table.
      280 +Note that the usual TCP/IP code is omitted is this example.
      281 +.Pp
      282 +In the code segment below,
      283 +.Fa incoming_fd
      284 +is the TCP connection file descriptor
      285 +that is accepted as part of the redirect process, while
      286 +.Fa remote_fd
      287 +is the outgoing TCP connection to the remote server being translated back to the
 250  288  original IP address/port pair.
 251      -.LP
 252      -Note -
 253      -.sp
 254      -.RS 2
      289 +.Pp
      290 +Note \(em
 255  291  The following ipnat headers must be included before you can use the code shown
 256  292  in this example:
 257      -.sp
 258      -.in +2
 259      -.nf
      293 +.Bd -literal -offset 2n
 260  294  #include <netinet/in.h>
 261  295  #include <arpa/inet.h>
 262  296  #include <net/if.h>
 263  297  #include <netinet/ipl.h>
 264  298  #include <netinet/ip_compat.h>
 265  299  #include <netinet/ip_fil.h>
 266  300  #include <netinet/ip_nat.h>
 267  301  #include <string.h>
 268  302  #include <fcntl.h>
 269      -.fi
 270      -.in -2
 271      -
 272      -.RE
 273      -.LP
 274      -Note -
 275      -.sp
 276      -.RS 2
      303 +.Ed
      304 +.Pp
      305 +Note \(em
 277  306  In the example below, various code fragments have been excluded to enhance
 278  307  clarity.
 279      -.RE
 280      -.sp
 281      -.in +2
 282      -.nf
      308 +.Bd -literal -offset 2n
 283  309  int
 284      -     translate_connection(int incoming_fd)
 285      -     {
 286      -          struct sockaddr_in usin;
 287      -          struct natlookup nlp;
 288      -          struct nat_save ns;
 289      -          struct ipfobj obj;
 290      -          struct nat *nat;
 291      -          int remote_fd;
 292      -          int nat_fd;
 293      -          int onoff;
      310 +translate_connection(int incoming_fd)
      311 +{
      312 +     struct sockaddr_in usin;
      313 +     struct natlookup nlp;
      314 +     struct nat_save ns;
      315 +     struct ipfobj obj;
      316 +     struct nat *nat;
      317 +     int remote_fd;
      318 +     int nat_fd;
      319 +     int onoff;
 294  320  
 295      -          memset(&ns, 0, sizeof(ns));
 296      -          nat = &ns.ipn_nat
      321 +     memset(&ns, 0, sizeof(ns));
      322 +     nat = &ns.ipn_nat
 297  323  
 298      -          namelen = sizeof(usin);
 299      -          getsockname(remote_fd, (struct sockaddr *)&usin, &namelen);
      324 +     namelen = sizeof(usin);
      325 +     getsockname(remote_fd, (struct sockaddr *)&usin, &namelen);
 300  326  
 301      -          namelen = sizeof(sin);
 302      -          getpeername(incoming_fd, (struct sockaddr *) &sin, &namelen);
      327 +     namelen = sizeof(sin);
      328 +     getpeername(incoming_fd, (struct sockaddr *) &sin, &namelen);
 303  329  
 304      -          namelen = sizeof(sloc);
 305      -          getsockname(incoming_fd, (struct sockaddr *) &sloc, &namelen);
      330 +     namelen = sizeof(sloc);
      331 +     getsockname(incoming_fd, (struct sockaddr *) &sloc, &namelen);
 306  332  
 307      -          bzero((char *) &obi, sizeof(obj));
 308      -          obj.ipfo_rev = IPFILTER_VERSION;
 309      -          obj.ipfo_size = sizeof(nlp);
 310      -          obj.ipfo_ptr = &nip;
 311      -          obj.ipfo_type = IPFOBJ_NATLOOKUP;
      333 +     bzero((char *) &obi, sizeof(obj));
      334 +     obj.ipfo_rev = IPFILTER_VERSION;
      335 +     obj.ipfo_size = sizeof(nlp);
      336 +     obj.ipfo_ptr = &nip;
      337 +     obj.ipfo_type = IPFOBJ_NATLOOKUP;
 312  338  
 313      -          /*
 314      -           * Build up the NAT natlookup structure.
 315      -           */
 316      -          bzero((char *) &nlp, sizeof(nlp));
 317      -          nlp.nl_outip = sin.sin_addr;
 318      -          nlp.nl_inip = sloc.sin_addr;
 319      -          nlp.nl_flags = IPN_TCP;
 320      -          nlp.nl_outport = ntohs(sin.sin_port);
 321      -          nlp.nl_inport = ntohs(sloc.sin_port);
      339 +     /*
      340 +      * Build up the NAT natlookup structure.
      341 +      */
      342 +     bzero((char *) &nlp, sizeof(nlp));
      343 +     nlp.nl_outip = sin.sin_addr;
      344 +     nlp.nl_inip = sloc.sin_addr;
      345 +     nlp.nl_flags = IPN_TCP;
      346 +     nlp.nl_outport = ntohs(sin.sin_port);
      347 +     nlp.nl_inport = ntohs(sloc.sin_port);
 322  348  
 323      -          /*
 324      -           * Open the NAT device and lookup the mapping pair.
 325      -           */
 326      -          nat_fd = open(IPNAT_NAME, O_RDWR);
 327      -          if (ioctl(nat_fd, SIOCGNATL, &obj) != 0)
 328      -               return -1;
      349 +     /*
      350 +      * Open the NAT device and lookup the mapping pair.
      351 +      */
      352 +     nat_fd = open(IPNAT_NAME, O_RDWR);
      353 +     if (ioctl(nat_fd, SIOCGNATL, &obj) != 0)
      354 +          return -1;
 329  355  
 330      -          nat->nat_inip = usin.sin_addr;
 331      -          nat->nat_outip = nlp.nl_outip;
 332      -          nat->nat_oip = nlp.nl_realip;
      356 +     nat->nat_inip = usin.sin_addr;
      357 +     nat->nat_outip = nlp.nl_outip;
      358 +     nat->nat_oip = nlp.nl_realip;
 333  359  
 334      -          sum1 = LONG_SUM(ntohl(usin.sin_addr.s_addr)) +
 335      -                 ntohs(usin.sin_port);
 336      -          sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr)) +
 337      -                 ntohs(nlp.nl_outport);
 338      -          CALC_SUMD(sum1, sum2, sumd);
 339      -          nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
 340      -          nat->nat_sumd[1] = nat->nat_sumd[0];
      360 +     sum1 = LONG_SUM(ntohl(usin.sin_addr.s_addr)) +
      361 +            ntohs(usin.sin_port);
      362 +     sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr)) +
      363 +            ntohs(nlp.nl_outport);
      364 +     CALC_SUMD(sum1, sum2, sumd);
      365 +     nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
      366 +     nat->nat_sumd[1] = nat->nat_sumd[0];
 341  367  
 342      -          sum1 = LONG_SUM(ntohl(usin.sin_addr.s_addr));
 343      -          sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr));
 344      -          CALC_SUMD(sum1, sum2, sumd);
 345      -          nat->nat_ipsumd = (sumd & 0xffff) + (sumd >> 16);
      368 +     sum1 = LONG_SUM(ntohl(usin.sin_addr.s_addr));
      369 +     sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr));
      370 +     CALC_SUMD(sum1, sum2, sumd);
      371 +     nat->nat_ipsumd = (sumd & 0xffff) + (sumd >> 16);
 346  372  
 347      -          nat->nat_inport = usin.sin_port;
 348      -          nat->nat_outport = nlp.nl_outport;
 349      -          nat->nat_oport = nlp.nl_realport;
      373 +     nat->nat_inport = usin.sin_port;
      374 +     nat->nat_outport = nlp.nl_outport;
      375 +     nat->nat_oport = nlp.nl_realport;
 350  376  
 351      -          nat->nat_flags = IPN_TCPUDP;
      377 +     nat->nat_flags = IPN_TCPUDP;
 352  378  
 353      -          /*
 354      -           * Prepare the ipfobj structure, accordingly.
 355      -           */
 356      -          bzero((char *)&obi, sizeof(obj));
 357      -          obj.ipfo_rev = IPFILTER_VERSION;
 358      -          obj.ipfo_size = sizeof(*nsp);
 359      -          obj.ipfo_ptr = nsp;
 360      -          obj.ipfo_type = IPFOBJ_NATSAVE;
      379 +     /*
      380 +      * Prepare the ipfobj structure, accordingly.
      381 +      */
      382 +     bzero((char *)&obi, sizeof(obj));
      383 +     obj.ipfo_rev = IPFILTER_VERSION;
      384 +     obj.ipfo_size = sizeof(*nsp);
      385 +     obj.ipfo_ptr = nsp;
      386 +     obj.ipfo_type = IPFOBJ_NATSAVE;
 361  387  
 362      -          onoff = 1;
 363      -          if (ioctl(nat_fd, SIOCSTPUT, &obj) != 0)
 364      -               fprintf(stderr, "Error occurred\en");
      388 +     onoff = 1;
      389 +     if (ioctl(nat_fd, SIOCSTPUT, &obj) != 0)
      390 +          fprintf(stderr, "Error occurred\en");
 365  391  
 366      -          return connect(rem_fd, (struct sockaddr ) &usin, sizeof(usin));
 367      -     }
 368      -.fi
 369      -.in -2
 370      -
 371      -.SH ERRORS
 372      -.sp
 373      -.ne 2
 374      -.na
 375      -\fBEPERM\fR
 376      -.ad
 377      -.RS 10n
 378      -The device has been opened for reading only. To succeed, the ioctl call must be
 379      -opened for both reading and writing. The call may be returned if it is
 380      -privileged and the calling process did not assert  {\fBPRIV_SYS_NET_CONFIG\fR}
      392 +     return connect(rem_fd, (struct sockaddr)&usin, sizeof(usin));
      393 +}
      394 +.Ed
      395 +.Sh ERRORS
      396 +.Bl -tag -width Er
      397 +.It Er EPERM
      398 +The device has been opened for reading only.
      399 +To succeed, the ioctl call must be opened for both reading and writing.
      400 +The call may be returned if it is
      401 +privileged and the calling process did not assert
      402 +.Brq Sy PRIV_SYS_NET_CONFIG
 381  403  in the effective set.
 382      -.RE
 383      -
 384      -.sp
 385      -.ne 2
 386      -.na
 387      -\fBENOMEM\fR
 388      -.ad
 389      -.RS 10n
 390      -More memory was allocated than the kernel can provide. The call may also be
 391      -returned if the application inserts a NAT entry that exceeds the hash bucket
 392      -chain's maximum length.
 393      -.RE
 394      -
 395      -.sp
 396      -.ne 2
 397      -.na
 398      -\fBEFAULT\fR
 399      -.ad
 400      -.RS 10n
      404 +.It Er ENOMEM
      405 +More memory was allocated than the kernel can provide.
      406 +The call may also be returned if the application inserts a NAT entry that
      407 +exceeds the hash bucket chain's maximum length.
      408 +.It Er EFAULT
 401  409  The calling process specified an invalid pointer in the ipfobj structure.
 402      -.RE
 403      -
 404      -.sp
 405      -.ne 2
 406      -.na
 407      -\fBEINVAL\fR
 408      -.ad
 409      -.RS 10n
      410 +.It Er EINVAL
 410  411  The calling process detected a parameter or field set to an unacceptable value.
 411      -.RE
 412      -
 413      -.sp
 414      -.ne 2
 415      -.na
 416      -\fBEEXIST\fR
 417      -.ad
 418      -.RS 10n
 419      -The calling process, via \fBSIOCSTPUT\fR, attempted to add a NAT entry that
 420      -already exists in the NAT table.
 421      -.RE
 422      -
 423      -.sp
 424      -.ne 2
 425      -.na
 426      -\fBESRCH\fR
 427      -.ad
 428      -.RS 10n
 429      -The calling process called \fBSIOCSTPUT\fR before setting the SI_NEWFR flag and
 430      -providing a pointer in the nat_fr  field that cannot  be found in the current
 431      -rule set.
 432      -.RE
 433      -
 434      -.sp
 435      -.ne 2
 436      -.na
 437      -\fBEACESS\fR
 438      -.ad
 439      -.RS 10n
 440      -The calling process issued a \fBSIOCSTPUT\fR before issuing a SIOCSTLCK.
 441      -.RE
 442      -
 443      -.SH ATTRIBUTES
 444      -.sp
 445      -.LP
 446      -See \fBattributes\fR(5) for descriptions of the following attributes:
 447      -.sp
 448      -
 449      -.sp
 450      -.TS
 451      -box;
 452      -c | c
 453      -l | l .
 454      -ATTRIBUTE TYPE  ATTRIBUTE VALUE
 455      -_
 456      -Interface Stability     Committed
 457      -.TE
 458      -
 459      -.SH SEE ALSO
 460      -.sp
 461      -.LP
 462      -\fBipfs\fR(1M), \fBipnat\fR(1M), \fBioctl\fR(2), \fBattributes\fR(5)
      412 +.It Er EEXIST
      413 +The calling process, via
      414 +.Dv SIOCSTPUT ,
      415 +attempted to add a NAT entry that already exists in the NAT table.
      416 +.It Er ESRCH
      417 +The calling process called
      418 +.Dv SIOCSTPUT
      419 +before setting the
      420 +.Dv SI_NEWFR
      421 +flag and providing a pointer in the
      422 +.Fa nat_fr
      423 +field that cannot  be found in the current rule set.
      424 +.It Er EACESS
      425 +The calling process issued a
      426 +.Dv SIOCSTPUT
      427 +before issuing a
      428 +.Dv SIOCSTLCK .
      429 +.El
      430 +.Sh INTERFACE STABILITY
      431 +Committed
      432 +.Sh SEE ALSO
      433 +.Xr ipfs 1M ,
      434 +.Xr ipnat 1M ,
      435 +.Xr ioctl 2 ,
      436 +.Xr attributes 5
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX