The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netinet/ip_var.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: ip_var.h,v 1.90 2008/10/12 11:15:54 plunky Exp $       */
    2 
    3 /*
    4  * Copyright (c) 1982, 1986, 1993
    5  *      The Regents of the University of California.  All rights reserved.
    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. Neither the name of the University nor the names of its contributors
   16  *    may be used to endorse or promote products derived from this software
   17  *    without specific prior written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   29  * SUCH DAMAGE.
   30  *
   31  *      @(#)ip_var.h    8.2 (Berkeley) 1/9/95
   32  */
   33 
   34 #ifndef _NETINET_IP_VAR_H_
   35 #define _NETINET_IP_VAR_H_
   36 
   37 #include <sys/queue.h>
   38 #include <net/route.h>
   39 
   40 /*
   41  * Overlay for ip header used by other protocols (tcp, udp).
   42  */
   43 struct ipovly {
   44         u_int8_t  ih_x1[9];             /* (unused) */
   45         u_int8_t  ih_pr;                /* protocol */
   46         u_int16_t ih_len;               /* protocol length */
   47         struct    in_addr ih_src;       /* source internet address */
   48         struct    in_addr ih_dst;       /* destination internet address */
   49 } __packed;
   50 
   51 /*
   52  * Ip (reassembly or sequence) queue structures.
   53  *
   54  * XXX -- The following explains why the ipqe_m field is here, for TCP's use:
   55  * We want to avoid doing m_pullup on incoming packets but that
   56  * means avoiding dtom on the tcp reassembly code.  That in turn means
   57  * keeping an mbuf pointer in the reassembly queue (since we might
   58  * have a cluster).  As a quick hack, the source & destination
   59  * port numbers (which are no longer needed once we've located the
   60  * tcpcb) are overlayed with an mbuf pointer.
   61  */
   62 TAILQ_HEAD(ipqehead, ipqent);
   63 struct ipqent {
   64         TAILQ_ENTRY(ipqent) ipqe_q;
   65         union {
   66                 struct ip       *_ip;
   67                 struct tcpiphdr *_tcp;
   68         } _ipqe_u1;
   69         struct mbuf     *ipqe_m;        /* point to first mbuf */
   70         struct mbuf     *ipre_mlast;    /* point to last mbuf */
   71         u_int8_t        ipqe_mff;       /* for IP fragmentation */
   72         /*
   73          * The following are used in TCP reassembly
   74          */
   75         TAILQ_ENTRY(ipqent) ipqe_timeq;
   76         u_int32_t ipqe_seq;
   77         u_int32_t ipqe_len;
   78         u_int32_t ipqe_flags;
   79 };
   80 #define ipqe_ip         _ipqe_u1._ip
   81 #define ipqe_tcp        _ipqe_u1._tcp
   82 
   83 /*
   84  * Ip reassembly queue structure.  Each fragment
   85  * being reassembled is attached to one of these structures.
   86  * They are timed out after ipq_ttl drops to 0, and may also
   87  * be reclaimed if memory becomes tight.
   88  */
   89 struct ipq {
   90         LIST_ENTRY(ipq) ipq_q;          /* to other reass headers */
   91         u_int8_t  ipq_ttl;              /* time for reass q to live */
   92         u_int8_t  ipq_p;                /* protocol of this fragment */
   93         u_int16_t ipq_id;               /* sequence id for reassembly */
   94         struct    ipqehead ipq_fragq;   /* to ip fragment queue */
   95         struct    in_addr ipq_src, ipq_dst;
   96         u_int16_t ipq_nfrags;           /* frags in this queue entry */
   97         u_int8_t  ipq_tos;              /* TOS of this fragment */
   98 };
   99 
  100 /*
  101  * Structure stored in mbuf in inpcb.ip_options
  102  * and passed to ip_output when ip options are in use.
  103  * The actual length of the options (including ipopt_dst)
  104  * is in m_len.
  105  */
  106 #define MAX_IPOPTLEN    40
  107 
  108 struct ipoption {
  109         struct  in_addr ipopt_dst;      /* first-hop dst if source routed */
  110         int8_t  ipopt_list[MAX_IPOPTLEN];       /* options proper */
  111 };
  112 
  113 /*
  114  * Structure attached to inpcb.ip_moptions and
  115  * passed to ip_output when IP multicast options are in use.
  116  */
  117 struct ip_moptions {
  118         struct    ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */
  119         struct in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */
  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];
  124 };
  125 
  126 /*
  127  * IP statistics.
  128  * Each counter is an unsigned 64-bit value.
  129  */
  130 #define IP_STAT_TOTAL           0       /* total packets received */
  131 #define IP_STAT_BADSUM          1       /* checksum bad */
  132 #define IP_STAT_TOOSHORT        2       /* packet too short */
  133 #define IP_STAT_TOOSMALL        3       /* not enough data */
  134 #define IP_STAT_BADHLEN         4       /* ip header length < data size */
  135 #define IP_STAT_BADLEN          5       /* ip length < ip header length */
  136 #define IP_STAT_FRAGMENTS       6       /* fragments received */
  137 #define IP_STAT_FRAGDROPPED     7       /* frags dropped (dups, out of space) */
  138 #define IP_STAT_FRAGTIMEOUT     8       /* fragments timed out */
  139 #define IP_STAT_FORWARD         9       /* packets forwarded */
  140 #define IP_STAT_FASTFORWARD     10      /* packets fast forwarded */
  141 #define IP_STAT_CANTFORWARD     11      /* packets rcvd for unreachable dest */
  142 #define IP_STAT_REDIRECTSENT    12      /* packets forwareded on same net */
  143 #define IP_STAT_NOPROTO         13      /* unknown or unsupported protocol */
  144 #define IP_STAT_DELIVERED       14      /* datagrams delivered to upper level */
  145 #define IP_STAT_LOCALOUT        15      /* total ip packets generated here */
  146 #define IP_STAT_ODROPPED        16      /* lost packets due to nobufs, etc. */
  147 #define IP_STAT_REASSEMBLED     17      /* total packets reassembled ok */
  148 #define IP_STAT_FRAGMENTED      18      /* datagrams successfully fragmented */
  149 #define IP_STAT_OFRAGMENTS      19      /* output fragments created */
  150 #define IP_STAT_CANTFRAG        20      /* don't fragment flag was set, etc. */
  151 #define IP_STAT_BADOPTIONS      21      /* error in option processing */
  152 #define IP_STAT_NOROUTE         22      /* packets discarded due to no route */
  153 #define IP_STAT_BADVERS         23      /* ip version != 4 */
  154 #define IP_STAT_RAWOUT          24      /* total raw ip packets generated */
  155 #define IP_STAT_BADFRAGS        25      /* malformed fragments (bad length) */
  156 #define IP_STAT_RCVMEMDROP      26      /* frags dropped for lack of memory */
  157 #define IP_STAT_TOOLONG         27      /* ip length > max ip packet size */
  158 #define IP_STAT_NOGIF           28      /* no match gif found */
  159 #define IP_STAT_BADADDR         29      /* invalid address on header */
  160 
  161 #define IP_NSTATS               30
  162 
  163 #ifdef _KERNEL
  164 
  165 #ifdef _KERNEL_OPT
  166 #include "opt_gateway.h"
  167 #include "opt_mbuftrace.h"
  168 #endif
  169 
  170 /* flags passed to ip_output as last parameter */
  171 #define IP_FORWARDING           0x1             /* most of ip header exists */
  172 #define IP_RAWOUTPUT            0x2             /* raw ip header exists */
  173 #define IP_RETURNMTU            0x4             /* pass back mtu on EMSGSIZE */
  174 #define IP_NOIPNEWID            0x8             /* don't fill in ip_id */
  175 #define IP_ROUTETOIF            SO_DONTROUTE    /* bypass routing tables */
  176 #define IP_ALLOWBROADCAST       SO_BROADCAST    /* can send broadcast packets */
  177 #define IP_MTUDISC              0x0400          /* Path MTU Discovery; set DF */
  178 
  179 extern struct domain inetdomain;
  180 
  181 extern LIST_HEAD(ipqhead, ipq) ipq[];   /* ip reass. queue */
  182 extern int   ip_defttl;                 /* default IP ttl */
  183 extern int   ipforwarding;              /* ip forwarding */
  184 extern int   ip_mtudisc;                /* mtu discovery */
  185 extern int   ip_mtudisc_timeout;        /* seconds to timeout mtu discovery */
  186 extern int   anonportmin;               /* minimum ephemeral port */
  187 extern int   anonportmax;               /* maximum ephemeral port */
  188 extern int   lowportmin;                /* minimum reserved port */
  189 extern int   lowportmax;                /* maximum reserved port */
  190 extern int   ip_do_loopback_cksum;      /* do IP checksum on loopback? */
  191 extern struct rttimer_queue *ip_mtudisc_timeout_q;
  192 #ifdef MBUFTRACE
  193 extern struct mowner ip_rx_mowner;
  194 extern struct mowner ip_tx_mowner;
  195 #endif
  196 #ifdef GATEWAY
  197 extern int ip_maxflows;
  198 extern int ip_hashsize;
  199 #endif
  200 extern struct pool inmulti_pool;
  201 extern struct pool ipqent_pool;
  202 struct   inpcb;
  203 struct   sockopt;
  204 
  205 int      ip_ctloutput(int, struct socket *, struct sockopt *);
  206 int      ip_dooptions(struct mbuf *);
  207 void     ip_drain(void);
  208 void     ip_forward(struct mbuf *, int);
  209 void     ip_freef(struct ipq *);
  210 void     ip_freemoptions(struct ip_moptions *);
  211 int      ip_getmoptions(struct ip_moptions *, struct sockopt *);
  212 void     ip_init(void);
  213 int      ip_optcopy(struct ip *, struct ip *);
  214 u_int    ip_optlen(struct inpcb *);
  215 int      ip_output(struct mbuf *, ...);
  216 int      ip_fragment(struct mbuf *, struct ifnet *, u_long);
  217 int      ip_pcbopts(struct mbuf **, const struct sockopt *);
  218 struct mbuf *
  219          ip_reass(struct ipqent *, struct ipq *, struct ipqhead *);
  220 struct in_ifaddr *
  221          ip_rtaddr(struct in_addr);
  222 void     ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
  223            struct mbuf *);
  224 int      ip_setmoptions(struct ip_moptions **, const struct sockopt *);
  225 void     ip_slowtimo(void);
  226 struct mbuf *
  227          ip_srcroute(void);
  228 int      ip_sysctl(int *, u_int, void *, size_t *, void *, size_t);
  229 void     ip_statinc(u_int);
  230 void     ipintr(void);
  231 void *   rip_ctlinput(int, const struct sockaddr *, void *);
  232 int      rip_ctloutput(int, struct socket *, struct sockopt *);
  233 void     rip_init(void);
  234 void     rip_input(struct mbuf *, ...);
  235 int      rip_output(struct mbuf *, ...);
  236 int      rip_usrreq(struct socket *,
  237             int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
  238 int     ipflow_init(int);
  239 void    ipflow_prune(void);
  240 void    ipflow_create(const struct route *, struct mbuf *);
  241 void    ipflow_slowtimo(void);
  242 int     ipflow_invalidate_all(int);
  243 
  244 #endif  /* _KERNEL */
  245 
  246 #endif /* !_NETINET_IP_VAR_H_ */

Cache object: d1945796556be6080a7e15f0f7b720fe


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.