[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.47

1.47    ! matt        1: /*     $NetBSD: ip_var.h,v 1.46 2001/12/21 02:51:47 itojun 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:  */
1.47    ! matt       66: TAILQ_HEAD(ipqehead, ipqent);
1.15      cgd        67: struct ipqent {
1.47    ! matt       68:        TAILQ_ENTRY(ipqent) ipqe_q;
1.15      cgd        69:        union {
                     70:                struct ip       *_ip;
                     71:                struct tcpiphdr *_tcp;
                     72:        } _ipqe_u1;
1.47    ! matt       73:        struct mbuf     *ipqe_m;        /* point to first mbuf */
        !            74:        struct mbuf     *ipre_mlast;    /* point to last mbuf */
1.20      thorpej    75:        u_int8_t        ipqe_mff;       /* for IP fragmentation */
1.28      matt       76:        /*
                     77:         * The following are used in TCP reassembly
                     78:         */
1.47    ! matt       79:        TAILQ_ENTRY(ipqent) ipqe_timeq;
1.28      matt       80:        u_int32_t ipqe_seq;
                     81:        u_int32_t ipqe_len;
                     82:        u_int32_t ipqe_flags;
1.15      cgd        83: };
                     84: #define        ipqe_ip         _ipqe_u1._ip
                     85: #define        ipqe_tcp        _ipqe_u1._tcp
                     86:
                     87: /*
1.1       cgd        88:  * Ip reassembly queue structure.  Each fragment
                     89:  * being reassembled is attached to one of these structures.
                     90:  * They are timed out after ipq_ttl drops to 0, and may also
                     91:  * be reclaimed if memory becomes tight.
                     92:  */
                     93: struct ipq {
1.15      cgd        94:        LIST_ENTRY(ipq) ipq_q;          /* to other reass headers */
1.12      cgd        95:        u_int8_t  ipq_ttl;              /* time for reass q to live */
                     96:        u_int8_t  ipq_p;                /* protocol of this fragment */
                     97:        u_int16_t ipq_id;               /* sequence id for reassembly */
1.15      cgd        98:        struct    ipqehead ipq_fragq;   /* to ip fragment queue */
1.14      mycroft    99:        struct    in_addr ipq_src, ipq_dst;
1.1       cgd       100: };
                    101:
                    102: /*
                    103:  * Structure stored in mbuf in inpcb.ip_options
                    104:  * and passed to ip_output when ip options are in use.
                    105:  * The actual length of the options (including ipopt_dst)
                    106:  * is in m_len.
                    107:  */
1.5       mycroft   108: #define        MAX_IPOPTLEN    40
1.1       cgd       109:
                    110: struct ipoption {
                    111:        struct  in_addr ipopt_dst;      /* first-hop dst if source routed */
1.12      cgd       112:        int8_t  ipopt_list[MAX_IPOPTLEN];       /* options proper */
1.1       cgd       113: };
                    114:
1.4       hpeyerl   115: /*
                    116:  * Structure attached to inpcb.ip_moptions and
                    117:  * passed to ip_output when IP multicast options are in use.
                    118:  */
                    119: struct ip_moptions {
1.12      cgd       120:        struct    ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */
1.44      itojun    121:        struct in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */
1.12      cgd       122:        u_int8_t  imo_multicast_ttl;    /* TTL for outgoing multicasts */
                    123:        u_int8_t  imo_multicast_loop;   /* 1 => hear sends if a member */
                    124:        u_int16_t imo_num_memberships;  /* no. memberships this socket */
                    125:        struct    in_multi *imo_membership[IP_MAX_MEMBERSHIPS];
1.4       hpeyerl   126: };
                    127:
1.1       cgd       128: struct ipstat {
1.39      bouyer    129:        u_quad_t ips_total;             /* total packets received */
                    130:        u_quad_t ips_badsum;            /* checksum bad */
                    131:        u_quad_t ips_tooshort;          /* packet too short */
                    132:        u_quad_t ips_toosmall;          /* not enough data */
                    133:        u_quad_t ips_badhlen;           /* ip header length < data size */
                    134:        u_quad_t ips_badlen;            /* ip length < ip header length */
                    135:        u_quad_t ips_fragments;         /* fragments received */
                    136:        u_quad_t ips_fragdropped;       /* frags dropped (dups, out of space) */
                    137:        u_quad_t ips_fragtimeout;       /* fragments timed out */
                    138:        u_quad_t ips_forward;           /* packets forwarded */
                    139:        u_quad_t ips_fastforward;       /* packets fast forwarded */
                    140:        u_quad_t ips_cantforward;       /* packets rcvd for unreachable dest */
                    141:        u_quad_t ips_redirectsent;      /* packets forwarded on same net */
                    142:        u_quad_t ips_noproto;           /* unknown or unsupported protocol */
                    143:        u_quad_t ips_delivered;         /* datagrams delivered to upper level*/
                    144:        u_quad_t ips_localout;          /* total ip packets generated here */
                    145:        u_quad_t ips_odropped;          /* lost packets due to nobufs, etc. */
                    146:        u_quad_t ips_reassembled;       /* total packets reassembled ok */
                    147:        u_quad_t ips_fragmented;        /* datagrams sucessfully fragmented */
                    148:        u_quad_t ips_ofragments;        /* output fragments created */
                    149:        u_quad_t ips_cantfrag;          /* don't fragment flag was set, etc. */
                    150:        u_quad_t ips_badoptions;        /* error in option processing */
                    151:        u_quad_t ips_noroute;           /* packets discarded due to no route */
                    152:        u_quad_t ips_badvers;           /* ip version != 4 */
                    153:        u_quad_t ips_rawout;            /* total raw ip packets generated */
                    154:        u_quad_t ips_badfrags;          /* malformed fragments (bad length) */
                    155:        u_quad_t ips_rcvmemdrop;        /* frags dropped for lack of memory */
                    156:        u_quad_t ips_toolong;           /* ip length > max ip packet size */
                    157:        u_quad_t ips_nogif;             /* no match gif found */
1.45      itojun    158:        u_quad_t ips_badaddr;           /* invalid address on header */
1.1       cgd       159: };
                    160:
1.29      matt      161: #define        IPFLOW_HASHBITS                 6 /* should not be a multiple of 8 */
                    162: struct ipflow {
1.34      thorpej   163:        LIST_ENTRY(ipflow) ipf_list;    /* next in active list */
                    164:        LIST_ENTRY(ipflow) ipf_hash;    /* next ipflow in bucket */
1.29      matt      165:        struct in_addr ipf_dst;         /* destination address */
                    166:        struct in_addr ipf_src;         /* source address */
                    167:        u_int8_t ipf_tos;               /* type-of-service */
                    168:        struct route ipf_ro;            /* associated route entry */
                    169:        u_long ipf_uses;                /* number of uses in this period */
                    170:        u_long ipf_last_uses;           /* number of uses in last period */
                    171:        u_long ipf_dropped;             /* ENOBUFS returned by if_output */
                    172:        u_long ipf_errors;              /* other errors returned by if_output */
1.34      thorpej   173:        u_int ipf_timer;                /* lifetime timer */
1.29      matt      174:        time_t ipf_start;               /* creation time */
                    175: };
                    176:
1.11      jtc       177: #ifdef _KERNEL
1.1       cgd       178: /* flags passed to ip_output as last parameter */
                    179: #define        IP_FORWARDING           0x1             /* most of ip header exists */
1.9       mycroft   180: #define        IP_RAWOUTPUT            0x2             /* raw ip header exists */
1.21      thorpej   181: #define        IP_RETURNMTU            0x4             /* pass back mtu on EMSGSIZE */
1.1       cgd       182: #define        IP_ROUTETOIF            SO_DONTROUTE    /* bypass routing tables */
                    183: #define        IP_ALLOWBROADCAST       SO_BROADCAST    /* can send broadcast packets */
1.43      thorpej   184: #define        IP_MTUDISC              0x0400          /* Path MTU Discovery; set DF */
1.1       cgd       185:
1.29      matt      186: extern struct ipstat ipstat;           /* ip statistics */
                    187: extern LIST_HEAD(ipqhead, ipq) ipq;    /* ip reass. queue */
                    188: extern u_int16_t ip_id;                        /* ip packet ctr, for ids */
                    189: extern int   ip_defttl;                        /* default IP ttl */
                    190: extern int   ipforwarding;             /* ip forwarding */
1.27      kml       191: extern int   ip_mtudisc;               /* mtu discovery */
                    192: extern u_int ip_mtudisc_timeout;       /* seconds to timeout mtu discovery */
                    193: extern int   anonportmin;              /* minimum ephemeral port */
                    194: extern int   anonportmax;              /* maximum ephemeral port */
1.42      tron      195: extern int   lowportmin;               /* minimum reserved port */
                    196: extern int   lowportmax;               /* maximum reserved port */
1.27      kml       197: extern struct rttimer_queue *ip_mtudisc_timeout_q;
1.31      matt      198: #ifdef GATEWAY
                    199: extern int ip_maxflows;
                    200: #endif
1.35      thorpej   201: extern struct pool ipqent_pool;
1.19      thorpej   202: struct  inpcb;
                    203:
1.9       mycroft   204: int     ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
                    205: int     ip_dooptions __P((struct mbuf *));
                    206: void    ip_drain __P((void));
                    207: void    ip_forward __P((struct mbuf *, int));
                    208: void    ip_freef __P((struct ipq *));
                    209: void    ip_freemoptions __P((struct ip_moptions *));
                    210: int     ip_getmoptions __P((int, struct ip_moptions *, struct mbuf **));
                    211: void    ip_init __P((void));
                    212: int     ip_optcopy __P((struct ip *, struct ip *));
1.26      kml       213: u_int   ip_optlen __P((struct inpcb *));
1.16      christos  214: int     ip_output __P((struct mbuf *, ...));
1.9       mycroft   215: int     ip_pcbopts __P((struct mbuf **, struct mbuf *));
1.20      thorpej   216: struct mbuf *
1.15      cgd       217:         ip_reass __P((struct ipqent *, struct ipq *));
1.6       mycroft   218: struct in_ifaddr *
1.9       mycroft   219:         ip_rtaddr __P((struct in_addr));
1.19      thorpej   220: void    ip_savecontrol __P((struct inpcb *, struct mbuf **, struct ip *,
                    221:           struct mbuf *));
1.9       mycroft   222: int     ip_setmoptions __P((int, struct ip_moptions **, struct mbuf *));
                    223: void    ip_slowtimo __P((void));
1.6       mycroft   224: struct mbuf *
1.9       mycroft   225:         ip_srcroute __P((void));
                    226: void    ip_stripoptions __P((struct mbuf *, struct mbuf *));
                    227: int     ip_sysctl __P((int *, u_int, void *, size_t *, void *, size_t));
                    228: void    ipintr __P((void));
1.46      itojun    229: void *  rip_ctlinput __P((int, struct sockaddr *, void *));
1.9       mycroft   230: int     rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
                    231: void    rip_init __P((void));
1.16      christos  232: void    rip_input __P((struct mbuf *, ...));
                    233: int     rip_output __P((struct mbuf *, ...));
1.9       mycroft   234: int     rip_usrreq __P((struct socket *,
1.17      mycroft   235:            int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *));
1.36      thorpej   236: void   ipflow_init __P((void));
1.31      matt      237: struct ipflow *ipflow_reap __P((int));
                    238: void   ipflow_create __P((const struct route *, struct mbuf *));
                    239: void   ipflow_slowtimo __P((void));
1.1       cgd       240: #endif
1.25      perry     241:
                    242: #endif /* _NETINET_IP_VAR_H_ */

CVSweb <webmaster@jp.NetBSD.org>