[BACK]Return to ip_var.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / netinet

Annotation of src/sys/netinet/ip_var.h, Revision 1.41.4.1

1.41.4.1! tron        1: /*     $NetBSD: ip_var.h,v 1.42 2000/08/25 13:35:06 tron Exp $ */
1.10      cgd         2:
1.1       cgd         3: /*
1.9       mycroft     4:  * Copyright (c) 1982, 1986, 1993
                      5:  *     The Regents of the University of California.  All rights reserved.
1.1       cgd         6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  * 3. All advertising materials mentioning features or use of this software
                     16:  *    must display the following acknowledgement:
                     17:  *     This product includes software developed by the University of
                     18:  *     California, Berkeley and its contributors.
                     19:  * 4. Neither the name of the University nor the names of its contributors
                     20:  *    may be used to endorse or promote products derived from this software
                     21:  *    without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     24:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     25:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     26:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     27:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     28:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     29:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     31:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     32:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     33:  * SUCH DAMAGE.
                     34:  *
1.24      thorpej    35:  *     @(#)ip_var.h    8.2 (Berkeley) 1/9/95
1.1       cgd        36:  */
                     37:
1.25      perry      38: #ifndef _NETINET_IP_VAR_H_
                     39: #define _NETINET_IP_VAR_H_
                     40:
1.15      cgd        41: #include <sys/queue.h>
1.30      thorpej    42: #include <net/route.h>
1.15      cgd        43:
1.1       cgd        44: /*
                     45:  * Overlay for ip header used by other protocols (tcp, udp).
                     46:  */
                     47: struct ipovly {
1.18      thorpej    48:        u_int8_t  ih_x1[9];             /* (unused) */
                     49:        u_int8_t  ih_pr;                /* protocol */
                     50:        u_int16_t ih_len;               /* protocol length */
                     51:        struct    in_addr ih_src;       /* source internet address */
                     52:        struct    in_addr ih_dst;       /* destination internet address */
1.40      thorpej    53: } __attribute__((__packed__));
1.1       cgd        54:
                     55: /*
1.15      cgd        56:  * Ip (reassembly or sequence) queue structures.
                     57:  *
                     58:  * XXX -- The following explains why the ipqe_m field is here, for TCP's use:
                     59:  * We want to avoid doing m_pullup on incoming packets but that
                     60:  * means avoiding dtom on the tcp reassembly code.  That in turn means
                     61:  * keeping an mbuf pointer in the reassembly queue (since we might
                     62:  * have a cluster).  As a quick hack, the source & destination
                     63:  * port numbers (which are no longer needed once we've located the
                     64:  * tcpcb) are overlayed with an mbuf pointer.
                     65:  */
                     66: LIST_HEAD(ipqehead, ipqent);
                     67: struct ipqent {
                     68:        LIST_ENTRY(ipqent) ipqe_q;
                     69:        union {
                     70:                struct ip       *_ip;
                     71:                struct tcpiphdr *_tcp;
                     72:        } _ipqe_u1;
1.20      thorpej    73:        struct mbuf     *ipqe_m;        /* mbuf contains packet */
                     74:        u_int8_t        ipqe_mff;       /* for IP fragmentation */
1.28      matt       75:        /*
                     76:         * The following are used in TCP reassembly
                     77:         */
                     78:        LIST_ENTRY(ipqent) ipqe_timeq;
                     79:        u_int32_t ipqe_seq;
                     80:        u_int32_t ipqe_len;
                     81:        u_int32_t ipqe_flags;
1.15      cgd        82: };
                     83: #define        ipqe_ip         _ipqe_u1._ip
                     84: #define        ipqe_tcp        _ipqe_u1._tcp
                     85:
                     86: /*
1.1       cgd        87:  * Ip reassembly queue structure.  Each fragment
                     88:  * being reassembled is attached to one of these structures.
                     89:  * They are timed out after ipq_ttl drops to 0, and may also
                     90:  * be reclaimed if memory becomes tight.
                     91:  */
                     92: struct ipq {
1.15      cgd        93:        LIST_ENTRY(ipq) ipq_q;          /* to other reass headers */
1.12      cgd        94:        u_int8_t  ipq_ttl;              /* time for reass q to live */
                     95:        u_int8_t  ipq_p;                /* protocol of this fragment */
                     96:        u_int16_t ipq_id;               /* sequence id for reassembly */
1.15      cgd        97:        struct    ipqehead ipq_fragq;   /* to ip fragment queue */
1.14      mycroft    98:        struct    in_addr ipq_src, ipq_dst;
1.1       cgd        99: };
                    100:
                    101: /*
                    102:  * Structure stored in mbuf in inpcb.ip_options
                    103:  * and passed to ip_output when ip options are in use.
                    104:  * The actual length of the options (including ipopt_dst)
                    105:  * is in m_len.
                    106:  */
1.5       mycroft   107: #define        MAX_IPOPTLEN    40
1.1       cgd       108:
                    109: struct ipoption {
                    110:        struct  in_addr ipopt_dst;      /* first-hop dst if source routed */
1.12      cgd       111:        int8_t  ipopt_list[MAX_IPOPTLEN];       /* options proper */
1.1       cgd       112: };
                    113:
1.4       hpeyerl   114: /*
                    115:  * Structure attached to inpcb.ip_moptions and
                    116:  * passed to ip_output when IP multicast options are in use.
                    117:  */
                    118: struct ip_moptions {
1.12      cgd       119:        struct    ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */
                    120:        u_int8_t  imo_multicast_ttl;    /* TTL for outgoing multicasts */
                    121:        u_int8_t  imo_multicast_loop;   /* 1 => hear sends if a member */
                    122:        u_int16_t imo_num_memberships;  /* no. memberships this socket */
                    123:        struct    in_multi *imo_membership[IP_MAX_MEMBERSHIPS];
1.4       hpeyerl   124: };
                    125:
1.1       cgd       126: struct ipstat {
1.39      bouyer    127:        u_quad_t ips_total;             /* total packets received */
                    128:        u_quad_t ips_badsum;            /* checksum bad */
                    129:        u_quad_t ips_tooshort;          /* packet too short */
                    130:        u_quad_t ips_toosmall;          /* not enough data */
                    131:        u_quad_t ips_badhlen;           /* ip header length < data size */
                    132:        u_quad_t ips_badlen;            /* ip length < ip header length */
                    133:        u_quad_t ips_fragments;         /* fragments received */
                    134:        u_quad_t ips_fragdropped;       /* frags dropped (dups, out of space) */
                    135:        u_quad_t ips_fragtimeout;       /* fragments timed out */
                    136:        u_quad_t ips_forward;           /* packets forwarded */
                    137:        u_quad_t ips_fastforward;       /* packets fast forwarded */
                    138:        u_quad_t ips_cantforward;       /* packets rcvd for unreachable dest */
                    139:        u_quad_t ips_redirectsent;      /* packets forwarded on same net */
                    140:        u_quad_t ips_noproto;           /* unknown or unsupported protocol */
                    141:        u_quad_t ips_delivered;         /* datagrams delivered to upper level*/
                    142:        u_quad_t ips_localout;          /* total ip packets generated here */
                    143:        u_quad_t ips_odropped;          /* lost packets due to nobufs, etc. */
                    144:        u_quad_t ips_reassembled;       /* total packets reassembled ok */
                    145:        u_quad_t ips_fragmented;        /* datagrams sucessfully fragmented */
                    146:        u_quad_t ips_ofragments;        /* output fragments created */
                    147:        u_quad_t ips_cantfrag;          /* don't fragment flag was set, etc. */
                    148:        u_quad_t ips_badoptions;        /* error in option processing */
                    149:        u_quad_t ips_noroute;           /* packets discarded due to no route */
                    150:        u_quad_t ips_badvers;           /* ip version != 4 */
                    151:        u_quad_t ips_rawout;            /* total raw ip packets generated */
                    152:        u_quad_t ips_badfrags;          /* malformed fragments (bad length) */
                    153:        u_quad_t ips_rcvmemdrop;        /* frags dropped for lack of memory */
                    154:        u_quad_t ips_toolong;           /* ip length > max ip packet size */
                    155:        u_quad_t ips_nogif;             /* no match gif found */
1.1       cgd       156: };
                    157:
1.29      matt      158: #define        IPFLOW_HASHBITS                 6 /* should not be a multiple of 8 */
                    159: struct ipflow {
1.34      thorpej   160:        LIST_ENTRY(ipflow) ipf_list;    /* next in active list */
                    161:        LIST_ENTRY(ipflow) ipf_hash;    /* next ipflow in bucket */
1.29      matt      162:        struct in_addr ipf_dst;         /* destination address */
                    163:        struct in_addr ipf_src;         /* source address */
                    164:        u_int8_t ipf_tos;               /* type-of-service */
                    165:        struct route ipf_ro;            /* associated route entry */
                    166:        u_long ipf_uses;                /* number of uses in this period */
                    167:        u_long ipf_last_uses;           /* number of uses in last period */
                    168:        u_long ipf_dropped;             /* ENOBUFS returned by if_output */
                    169:        u_long ipf_errors;              /* other errors returned by if_output */
1.34      thorpej   170:        u_int ipf_timer;                /* lifetime timer */
1.29      matt      171:        time_t ipf_start;               /* creation time */
                    172: };
                    173:
1.11      jtc       174: #ifdef _KERNEL
1.1       cgd       175: /* flags passed to ip_output as last parameter */
                    176: #define        IP_FORWARDING           0x1             /* most of ip header exists */
1.9       mycroft   177: #define        IP_RAWOUTPUT            0x2             /* raw ip header exists */
1.21      thorpej   178: #define        IP_RETURNMTU            0x4             /* pass back mtu on EMSGSIZE */
1.1       cgd       179: #define        IP_ROUTETOIF            SO_DONTROUTE    /* bypass routing tables */
                    180: #define        IP_ALLOWBROADCAST       SO_BROADCAST    /* can send broadcast packets */
                    181:
1.29      matt      182: extern struct ipstat ipstat;           /* ip statistics */
                    183: extern LIST_HEAD(ipqhead, ipq) ipq;    /* ip reass. queue */
                    184: extern u_int16_t ip_id;                        /* ip packet ctr, for ids */
                    185: extern int   ip_defttl;                        /* default IP ttl */
                    186: extern int   ipforwarding;             /* ip forwarding */
1.27      kml       187: extern int   ip_mtudisc;               /* mtu discovery */
                    188: extern u_int ip_mtudisc_timeout;       /* seconds to timeout mtu discovery */
                    189: extern int   anonportmin;              /* minimum ephemeral port */
                    190: extern int   anonportmax;              /* maximum ephemeral port */
1.41.4.1! tron      191: extern int   lowportmin;               /* minimum reserved port */
        !           192: extern int   lowportmax;               /* maximum reserved port */
1.27      kml       193: extern struct rttimer_queue *ip_mtudisc_timeout_q;
1.31      matt      194: #ifdef GATEWAY
                    195: extern int ip_maxflows;
                    196: #endif
1.35      thorpej   197: extern struct pool ipqent_pool;
1.19      thorpej   198: struct  inpcb;
                    199:
1.9       mycroft   200: int     ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
                    201: int     ip_dooptions __P((struct mbuf *));
                    202: void    ip_drain __P((void));
                    203: void    ip_forward __P((struct mbuf *, int));
                    204: void    ip_freef __P((struct ipq *));
                    205: void    ip_freemoptions __P((struct ip_moptions *));
                    206: int     ip_getmoptions __P((int, struct ip_moptions *, struct mbuf **));
                    207: void    ip_init __P((void));
                    208: int     ip_optcopy __P((struct ip *, struct ip *));
1.26      kml       209: u_int   ip_optlen __P((struct inpcb *));
1.16      christos  210: int     ip_output __P((struct mbuf *, ...));
1.9       mycroft   211: int     ip_pcbopts __P((struct mbuf **, struct mbuf *));
1.20      thorpej   212: struct mbuf *
1.15      cgd       213:         ip_reass __P((struct ipqent *, struct ipq *));
1.6       mycroft   214: struct in_ifaddr *
1.9       mycroft   215:         ip_rtaddr __P((struct in_addr));
1.19      thorpej   216: void    ip_savecontrol __P((struct inpcb *, struct mbuf **, struct ip *,
                    217:           struct mbuf *));
1.9       mycroft   218: int     ip_setmoptions __P((int, struct ip_moptions **, struct mbuf *));
                    219: void    ip_slowtimo __P((void));
1.6       mycroft   220: struct mbuf *
1.9       mycroft   221:         ip_srcroute __P((void));
                    222: void    ip_stripoptions __P((struct mbuf *, struct mbuf *));
                    223: int     ip_sysctl __P((int *, u_int, void *, size_t *, void *, size_t));
                    224: void    ipintr __P((void));
                    225: int     rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
                    226: void    rip_init __P((void));
1.16      christos  227: void    rip_input __P((struct mbuf *, ...));
                    228: int     rip_output __P((struct mbuf *, ...));
1.9       mycroft   229: int     rip_usrreq __P((struct socket *,
1.17      mycroft   230:            int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *));
1.36      thorpej   231: void   ipflow_init __P((void));
1.31      matt      232: struct ipflow *ipflow_reap __P((int));
                    233: void   ipflow_create __P((const struct route *, struct mbuf *));
                    234: void   ipflow_slowtimo __P((void));
1.1       cgd       235: #endif
1.25      perry     236:
                    237: #endif /* _NETINET_IP_VAR_H_ */

CVSweb <webmaster@jp.NetBSD.org>