LCOV - code coverage report
Current view: top level - netinet - ip_var.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 3 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: ip_var.h,v 1.85 2017/11/15 11:48:59 mpi Exp $ */
       2             : /*      $NetBSD: ip_var.h,v 1.16 1996/02/13 23:43:20 christos Exp $     */
       3             : 
       4             : /*
       5             :  * Copyright (c) 1982, 1986, 1993
       6             :  *      The Regents of the University of California.  All rights reserved.
       7             :  *
       8             :  * Redistribution and use in source and binary forms, with or without
       9             :  * modification, are permitted provided that the following conditions
      10             :  * are met:
      11             :  * 1. Redistributions of source code must retain the above copyright
      12             :  *    notice, this list of conditions and the following disclaimer.
      13             :  * 2. Redistributions in binary form must reproduce the above copyright
      14             :  *    notice, this list of conditions and the following disclaimer in the
      15             :  *    documentation and/or other materials provided with the distribution.
      16             :  * 3. Neither the name of the University nor the names of its contributors
      17             :  *    may be used to endorse or promote products derived from this software
      18             :  *    without specific prior written permission.
      19             :  *
      20             :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      21             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      22             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      23             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      24             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      25             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      26             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      27             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      28             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      29             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      30             :  * SUCH DAMAGE.
      31             :  *
      32             :  *      @(#)ip_var.h    8.1 (Berkeley) 6/10/93
      33             :  */
      34             : 
      35             : #ifndef _NETINET_IP_VAR_H_
      36             : #define _NETINET_IP_VAR_H_
      37             : 
      38             : /*
      39             :  * Structure stored in mbuf in inpcb.ip_options
      40             :  * and passed to ip_output when ip options are in use.
      41             :  * The actual length of the options (including ipopt_dst)
      42             :  * is in m_len.
      43             :  */
      44             : #define MAX_IPOPTLEN    40
      45             : 
      46             : /*
      47             :  * Overlay for ip header used by other protocols (tcp, udp).
      48             :  */
      49             : struct ipovly {
      50             :         u_int8_t  ih_x1[9];             /* (unused) */
      51             :         u_int8_t  ih_pr;                /* protocol */
      52             :         u_int16_t ih_len;               /* protocol length */
      53             :         struct    in_addr ih_src;       /* source internet address */
      54             :         struct    in_addr ih_dst;       /* destination internet address */
      55             : };
      56             : 
      57             : struct  ipstat {
      58             :         u_long  ips_total;              /* total packets received */
      59             :         u_long  ips_badsum;             /* checksum bad */
      60             :         u_long  ips_tooshort;           /* packet too short */
      61             :         u_long  ips_toosmall;           /* not enough data */
      62             :         u_long  ips_badhlen;            /* ip header length < data size */
      63             :         u_long  ips_badlen;             /* ip length < ip header length */
      64             :         u_long  ips_fragments;          /* fragments received */
      65             :         u_long  ips_fragdropped;        /* frags dropped (dups, out of space) */
      66             :         u_long  ips_fragtimeout;        /* fragments timed out */
      67             :         u_long  ips_forward;            /* packets forwarded */
      68             :         u_long  ips_cantforward;        /* packets rcvd for unreachable dest */
      69             :         u_long  ips_redirectsent;       /* packets forwarded on same net */
      70             :         u_long  ips_noproto;            /* unknown or unsupported protocol */
      71             :         u_long  ips_delivered;          /* datagrams delivered to upper level*/
      72             :         u_long  ips_localout;           /* total ip packets generated here */
      73             :         u_long  ips_odropped;           /* lost packets due to nobufs, etc. */
      74             :         u_long  ips_reassembled;        /* total packets reassembled ok */
      75             :         u_long  ips_fragmented;         /* datagrams successfully fragmented */
      76             :         u_long  ips_ofragments;         /* output fragments created */
      77             :         u_long  ips_cantfrag;           /* don't fragment flag was set, etc. */
      78             :         u_long  ips_badoptions;         /* error in option processing */
      79             :         u_long  ips_noroute;            /* packets discarded due to no route */
      80             :         u_long  ips_badvers;            /* ip version != 4 */
      81             :         u_long  ips_rawout;             /* total raw ip packets generated */
      82             :         u_long  ips_badfrags;           /* malformed fragments (bad length) */
      83             :         u_long  ips_rcvmemdrop;         /* frags dropped for lack of memory */
      84             :         u_long  ips_toolong;            /* ip length > max ip packet size */
      85             :         u_long  ips_nogif;              /* no match gif found */
      86             :         u_long  ips_badaddr;            /* invalid address on header */
      87             :         u_long  ips_inswcsum;           /* software checksummed on input */
      88             :         u_long  ips_outswcsum;          /* software checksummed on output */
      89             :         u_long  ips_notmember;          /* multicasts for unregistered groups */
      90             : };
      91             : 
      92             : struct ipoption {
      93             :         struct  in_addr ipopt_dst;      /* first-hop dst if source routed */
      94             :         int8_t  ipopt_list[MAX_IPOPTLEN];       /* options proper */
      95             : };
      96             : 
      97             : #ifdef _KERNEL
      98             : 
      99             : #include <sys/percpu.h>
     100             : 
     101             : enum ipstat_counters {
     102             :         ips_total,              /* total packets received */
     103             :         ips_badsum,             /* checksum bad */
     104             :         ips_tooshort,           /* packet too short */
     105             :         ips_toosmall,           /* not enough data */
     106             :         ips_badhlen,            /* ip header length < data size */
     107             :         ips_badlen,             /* ip length < ip header length */
     108             :         ips_fragments,          /* fragments received */
     109             :         ips_fragdropped,        /* frags dropped (dups, out of space) */
     110             :         ips_fragtimeout,        /* fragments timed out */
     111             :         ips_forward,            /* packets forwarded */
     112             :         ips_cantforward,        /* packets rcvd for unreachable dest */
     113             :         ips_redirectsent,       /* packets forwarded on same net */
     114             :         ips_noproto,            /* unknown or unsupported protocol */
     115             :         ips_delivered,          /* datagrams delivered to upper level*/
     116             :         ips_localout,           /* total ip packets generated here */
     117             :         ips_odropped,           /* lost packets due to nobufs, etc. */
     118             :         ips_reassembled,        /* total packets reassembled ok */
     119             :         ips_fragmented,         /* datagrams successfully fragmented */
     120             :         ips_ofragments,         /* output fragments created */
     121             :         ips_cantfrag,           /* don't fragment flag was set, etc. */
     122             :         ips_badoptions,         /* error in option processing */
     123             :         ips_noroute,            /* packets discarded due to no route */
     124             :         ips_badvers,            /* ip version != 4 */
     125             :         ips_rawout,             /* total raw ip packets generated */
     126             :         ips_badfrags,           /* malformed fragments (bad length) */
     127             :         ips_rcvmemdrop,         /* frags dropped for lack of memory */
     128             :         ips_toolong,            /* ip length > max ip packet size */
     129             :         ips_nogif,              /* no match gif found */
     130             :         ips_badaddr,            /* invalid address on header */
     131             :         ips_inswcsum,           /* software checksummed on input */
     132             :         ips_outswcsum,          /* software checksummed on output */
     133             :         ips_notmember,          /* multicasts for unregistered groups */
     134             : 
     135             :         ips_ncounters
     136             : };
     137             : 
     138             : extern struct cpumem *ipcounters;
     139             : 
     140             : static inline void
     141           0 : ipstat_inc(enum ipstat_counters c)
     142             : {
     143           0 :         counters_inc(ipcounters, c);
     144           0 : }
     145             : 
     146             : /*
     147             :  * Structure attached to inpcb.ip_moptions and
     148             :  * passed to ip_output when IP multicast options are in use.
     149             :  */
     150             : struct ip_moptions {
     151             :         struct in_multi **imo_membership; /* group memberships */
     152             :         unsigned short imo_ifidx;       /* ifp index for outgoing multicasts */
     153             :         u_int8_t  imo_ttl;      /* TTL for outgoing multicasts */
     154             :         u_int8_t  imo_loop;     /* 1 => hear sends if a member */
     155             :         u_int16_t imo_num_memberships;  /* no. memberships this socket */
     156             :         u_int16_t imo_max_memberships;  /* max memberships this socket */
     157             : };
     158             : 
     159             : #include <sys/queue.h>
     160             : 
     161             : /*
     162             :  * Ip reassembly queue structures.
     163             :  */
     164             : LIST_HEAD(ipqehead, ipqent);
     165             : struct ipqent {
     166             :         LIST_ENTRY(ipqent) ipqe_q;
     167             :         struct ip       *ipqe_ip;
     168             :         struct mbuf     *ipqe_m;        /* mbuf contains packet */
     169             :         u_int8_t        ipqe_mff;       /* for IP fragmentation */
     170             : };
     171             : 
     172             : /*
     173             :  * Ip reassembly queue structure.  Each fragment
     174             :  * being reassembled is attached to one of these structures.
     175             :  * They are timed out after ipq_ttl drops to 0, and may also
     176             :  * be reclaimed if memory becomes tight.
     177             :  */
     178             : struct ipq {
     179             :         LIST_ENTRY(ipq) ipq_q;          /* to other reass headers */
     180             :         u_int8_t  ipq_ttl;              /* time for reass q to live */
     181             :         u_int8_t  ipq_p;                /* protocol of this fragment */
     182             :         u_int16_t ipq_id;               /* sequence id for reassembly */
     183             :         struct    ipqehead ipq_fragq;   /* to ip fragment queue */
     184             :         struct    in_addr ipq_src, ipq_dst;
     185             : };
     186             : 
     187             : /* flags passed to ip_output */
     188             : #define IP_FORWARDING           0x1             /* most of ip header exists */
     189             : #define IP_RAWOUTPUT            0x2             /* raw ip header exists */
     190             : #define IP_ALLOWBROADCAST       SO_BROADCAST    /* can send broadcast packets */
     191             : #define IP_MTUDISC              0x0800          /* pmtu discovery, set DF */
     192             : 
     193             : extern struct ipstat ipstat;
     194             : extern int ip_defttl;                   /* default IP ttl */
     195             : 
     196             : #define IPMTUDISCTIMEOUT (10 * 60)      /* as per RFC 1191 */
     197             : 
     198             : extern int ip_mtudisc;                  /* mtu discovery */
     199             : extern u_int ip_mtudisc_timeout;        /* seconds to timeout mtu discovery */
     200             : 
     201             : extern int ipport_firstauto;            /* min port for port allocation */
     202             : extern int ipport_lastauto;             /* max port for port allocation */
     203             : extern int ipport_hifirstauto;          /* min dynamic/private port number */
     204             : extern int ipport_hilastauto;           /* max dynamic/private port number */
     205             : extern int ipforwarding;                /* enable IP forwarding */
     206             : #ifdef MROUTING
     207             : extern int ipmforwarding;               /* enable multicast forwarding */
     208             : #endif
     209             : extern int ipmultipath;                 /* enable multipath routing */
     210             : extern int la_hold_total;
     211             : 
     212             : extern struct rttimer_queue *ip_mtudisc_timeout_q;
     213             : extern struct pool ipqent_pool;
     214             : struct route;
     215             : struct inpcb;
     216             : 
     217             : int      ip_ctloutput(int, struct socket *, int, int, struct mbuf *);
     218             : void     ip_flush(void);
     219             : int      ip_fragment(struct mbuf *, struct ifnet *, u_long);
     220             : void     ip_freef(struct ipq *);
     221             : void     ip_freemoptions(struct ip_moptions *);
     222             : int      ip_getmoptions(int, struct ip_moptions *, struct mbuf *);
     223             : void     ip_init(void);
     224             : struct mbuf*
     225             :          ip_insertoptions(struct mbuf *, struct mbuf *, int *);
     226             : int      ip_mforward(struct mbuf *, struct ifnet *);
     227             : int      ip_optcopy(struct ip *, struct ip *);
     228             : int      ip_output(struct mbuf *, struct mbuf *, struct route *, int,
     229             :             struct ip_moptions *, struct inpcb *, u_int32_t);
     230             : struct mbuf *
     231             :          ip_reass(struct ipqent *, struct ipq *);
     232             : u_int16_t
     233             :          ip_randomid(void);
     234             : void     ip_send(struct mbuf *);
     235             : void     ip_slowtimo(void);
     236             : struct mbuf *
     237             :          ip_srcroute(struct mbuf *);
     238             : void     ip_stripoptions(struct mbuf *);
     239             : int      ip_sysctl(int *, u_int, void *, size_t *, void *, size_t);
     240             : void     ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
     241             :             struct mbuf *);
     242             : void     ipintr(void);
     243             : int      ip_input_if(struct mbuf **, int *, int, int, struct ifnet *);
     244             : int      ip_deliver(struct mbuf **, int *, int, int);
     245             : void     ip_forward(struct mbuf *, struct ifnet *, struct rtentry *, int);
     246             : int      rip_ctloutput(int, struct socket *, int, int, struct mbuf *);
     247             : void     rip_init(void);
     248             : int      rip_input(struct mbuf **, int *, int, int);
     249             : int      rip_output(struct mbuf *, struct socket *, struct sockaddr *,
     250             :             struct mbuf *);
     251             : int      rip_usrreq(struct socket *,
     252             :             int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
     253             : int      rip_attach(struct socket *, int);
     254             : int      rip_detach(struct socket *);
     255             : #ifdef MROUTING
     256             : extern struct socket *ip_mrouter[];     /* multicast routing daemon */
     257             : #endif
     258             : 
     259             : #endif /* _KERNEL */
     260             : #endif /* _NETINET_IP_VAR_H_ */

Generated by: LCOV version 1.13