LCOV - code coverage report
Current view: top level - netinet6 - in6_var.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 2 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: in6_var.h,v 1.72 2018/05/06 15:21:25 florian Exp $    */
       2             : /*      $KAME: in6_var.h,v 1.55 2001/02/16 12:49:45 itojun Exp $        */
       3             : 
       4             : /*
       5             :  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
       6             :  * 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 project 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 PROJECT 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 PROJECT 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             : 
      33             : /*
      34             :  * Copyright (c) 1985, 1986, 1993
      35             :  *      The Regents of the University of California.  All rights reserved.
      36             :  *
      37             :  * Redistribution and use in source and binary forms, with or without
      38             :  * modification, are permitted provided that the following conditions
      39             :  * are met:
      40             :  * 1. Redistributions of source code must retain the above copyright
      41             :  *    notice, this list of conditions and the following disclaimer.
      42             :  * 2. Redistributions in binary form must reproduce the above copyright
      43             :  *    notice, this list of conditions and the following disclaimer in the
      44             :  *    documentation and/or other materials provided with the distribution.
      45             :  * 3. Neither the name of the University nor the names of its contributors
      46             :  *    may be used to endorse or promote products derived from this software
      47             :  *    without specific prior written permission.
      48             :  *
      49             :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      50             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      51             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      52             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      53             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      54             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      55             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      56             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      57             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      58             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      59             :  * SUCH DAMAGE.
      60             :  *
      61             :  *      @(#)in_var.h    8.1 (Berkeley) 6/10/93
      62             :  */
      63             : 
      64             : #ifndef _NETINET6_IN6_VAR_H_
      65             : #define _NETINET6_IN6_VAR_H_
      66             : 
      67             : /*
      68             :  * Interface address, Internet version.  One of these structures
      69             :  * is allocated for each interface with an Internet address.
      70             :  * The ifaddr structure contains the protocol-independent part
      71             :  * of the structure and is assumed to be first.
      72             :  */
      73             : 
      74             : /*
      75             :  * pltime/vltime are just for future reference (required to implements 2
      76             :  * hour rule for hosts).  they should never be modified by nd6_timeout or
      77             :  * anywhere else.
      78             :  *      userland -> kernel: accept pltime/vltime
      79             :  *      kernel -> userland: throw up everything
      80             :  *      in kernel: modify preferred/expire only
      81             :  */
      82             : struct in6_addrlifetime {
      83             :         time_t ia6t_expire;     /* valid lifetime expiration time */
      84             :         time_t ia6t_preferred;  /* preferred lifetime expiration time */
      85             :         u_int32_t ia6t_vltime;  /* valid lifetime */
      86             :         u_int32_t ia6t_pltime;  /* prefix lifetime */
      87             : };
      88             : 
      89             : #ifdef _KERNEL
      90             : struct nd_ifinfo;
      91             : struct in6_ifextra {
      92             :         struct nd_ifinfo *nd_ifinfo;
      93             :         void *rs_lhcookie;
      94             :         int nprefixes;
      95             :         int ndefrouters;
      96             : };
      97             : 
      98             : struct  in6_ifaddr {
      99             :         struct  ifaddr ia_ifa;          /* protocol-independent info */
     100             : #define ia_ifp          ia_ifa.ifa_ifp
     101             : #define ia_flags        ia_ifa.ifa_flags
     102             : 
     103             :         struct  sockaddr_in6 ia_addr;   /* interface address */
     104             :         struct  sockaddr_in6 ia_dstaddr; /* space for destination addr */
     105             :         struct  sockaddr_in6 ia_prefixmask; /* prefix mask */
     106             :         TAILQ_ENTRY(in6_ifaddr) ia_list;        /* list of IP6 addresses */
     107             :         int     ia6_flags;
     108             : 
     109             :         struct in6_addrlifetime ia6_lifetime;
     110             :         time_t  ia6_updatetime;
     111             : 
     112             :         /* multicast addresses joined from the kernel */
     113             :         LIST_HEAD(, in6_multi_mship) ia6_memberships;
     114             : };
     115             : #endif /* _KERNEL */
     116             : 
     117             : /*
     118             :  * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12).
     119             :  */
     120             : struct in6_ifstat {
     121             :         u_int64_t ifs6_in_receive;      /* # of total input datagram */
     122             :         u_int64_t ifs6_in_hdrerr;       /* # of datagrams with invalid hdr */
     123             :         u_int64_t ifs6_in_toobig;       /* # of datagrams exceeded MTU */
     124             :         u_int64_t ifs6_in_noroute;      /* # of datagrams with no route */
     125             :         u_int64_t ifs6_in_addrerr;      /* # of datagrams with invalid dst */
     126             :         u_int64_t ifs6_in_protounknown; /* # of datagrams with unknown proto */
     127             :                                         /* NOTE: increment on final dst if */
     128             :         u_int64_t ifs6_in_truncated;    /* # of truncated datagrams */
     129             :         u_int64_t ifs6_in_discard;      /* # of discarded datagrams */
     130             :                                         /* NOTE: fragment timeout is not here */
     131             :         u_int64_t ifs6_in_deliver;      /* # of datagrams delivered to ULP */
     132             :                                         /* NOTE: increment on final dst if */
     133             :         u_int64_t ifs6_out_forward;     /* # of datagrams forwarded */
     134             :                                         /* NOTE: increment on outgoing if */
     135             :         u_int64_t ifs6_out_request;     /* # of outgoing datagrams from ULP */
     136             :                                         /* NOTE: does not include forwrads */
     137             :         u_int64_t ifs6_out_discard;     /* # of discarded datagrams */
     138             :         u_int64_t ifs6_out_fragok;      /* # of datagrams fragmented */
     139             :         u_int64_t ifs6_out_fragfail;    /* # of datagrams failed on fragment */
     140             :         u_int64_t ifs6_out_fragcreat;   /* # of fragment datagrams */
     141             :                                         /* NOTE: this is # after fragment */
     142             :         u_int64_t ifs6_reass_reqd;      /* # of incoming fragmented packets */
     143             :                                         /* NOTE: increment on final dst if */
     144             :         u_int64_t ifs6_reass_ok;        /* # of reassembled packets */
     145             :                                         /* NOTE: this is # after reass */
     146             :                                         /* NOTE: increment on final dst if */
     147             :         u_int64_t ifs6_reass_fail;      /* # of reass failures */
     148             :                                         /* NOTE: may not be packet count */
     149             :                                         /* NOTE: increment on final dst if */
     150             :         u_int64_t ifs6_in_mcast;        /* # of inbound multicast datagrams */
     151             :         u_int64_t ifs6_out_mcast;       /* # of outbound multicast datagrams */
     152             : };
     153             : 
     154             : /*
     155             :  * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry.
     156             :  * XXX: I'm not sure if this file is the right place for this structure...
     157             :  */
     158             : struct icmp6_ifstat {
     159             :         /*
     160             :          * Input statistics
     161             :          */
     162             :         /* ipv6IfIcmpInMsgs, total # of input messages */
     163             :         u_int64_t ifs6_in_msg;
     164             :         /* ipv6IfIcmpInErrors, # of input error messages */
     165             :         u_int64_t ifs6_in_error;
     166             :         /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */
     167             :         u_int64_t ifs6_in_dstunreach;
     168             :         /* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */
     169             :         u_int64_t ifs6_in_adminprohib;
     170             :         /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */
     171             :         u_int64_t ifs6_in_timeexceed;
     172             :         /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */
     173             :         u_int64_t ifs6_in_paramprob;
     174             :         /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */
     175             :         u_int64_t ifs6_in_pkttoobig;
     176             :         /* ipv6IfIcmpInEchos, # of input echo requests */
     177             :         u_int64_t ifs6_in_echo;
     178             :         /* ipv6IfIcmpInEchoReplies, # of input echo replies */
     179             :         u_int64_t ifs6_in_echoreply;
     180             :         /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */
     181             :         u_int64_t ifs6_in_routersolicit;
     182             :         /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */
     183             :         u_int64_t ifs6_in_routeradvert;
     184             :         /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */
     185             :         u_int64_t ifs6_in_neighborsolicit;
     186             :         /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */
     187             :         u_int64_t ifs6_in_neighboradvert;
     188             :         /* ipv6IfIcmpInRedirects, # of input redirects */
     189             :         u_int64_t ifs6_in_redirect;
     190             :         /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */
     191             :         u_int64_t ifs6_in_mldquery;
     192             :         /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */
     193             :         u_int64_t ifs6_in_mldreport;
     194             :         /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */
     195             :         u_int64_t ifs6_in_mlddone;
     196             : 
     197             :         /*
     198             :          * Output statistics. We should solve unresolved routing problem...
     199             :          */
     200             :         /* ipv6IfIcmpOutMsgs, total # of output messages */
     201             :         u_int64_t ifs6_out_msg;
     202             :         /* ipv6IfIcmpOutErrors, # of output error messages */
     203             :         u_int64_t ifs6_out_error;
     204             :         /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */
     205             :         u_int64_t ifs6_out_dstunreach;
     206             :         /* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */
     207             :         u_int64_t ifs6_out_adminprohib;
     208             :         /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */
     209             :         u_int64_t ifs6_out_timeexceed;
     210             :         /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */
     211             :         u_int64_t ifs6_out_paramprob;
     212             :         /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */
     213             :         u_int64_t ifs6_out_pkttoobig;
     214             :         /* ipv6IfIcmpOutEchos, # of output echo requests */
     215             :         u_int64_t ifs6_out_echo;
     216             :         /* ipv6IfIcmpOutEchoReplies, # of output echo replies */
     217             :         u_int64_t ifs6_out_echoreply;
     218             :         /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */
     219             :         u_int64_t ifs6_out_routersolicit;
     220             :         /* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */
     221             :         u_int64_t ifs6_out_routeradvert;
     222             :         /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */
     223             :         u_int64_t ifs6_out_neighborsolicit;
     224             :         /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */
     225             :         u_int64_t ifs6_out_neighboradvert;
     226             :         /* ipv6IfIcmpOutRedirects, # of output redirects */
     227             :         u_int64_t ifs6_out_redirect;
     228             :         /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */
     229             :         u_int64_t ifs6_out_mldquery;
     230             :         /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */
     231             :         u_int64_t ifs6_out_mldreport;
     232             :         /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */
     233             :         u_int64_t ifs6_out_mlddone;
     234             : };
     235             : 
     236             : struct  in6_ifreq {
     237             :         char    ifr_name[IFNAMSIZ];
     238             :         union {
     239             :                 struct  sockaddr_in6 ifru_addr;
     240             :                 struct  sockaddr_in6 ifru_dstaddr;
     241             :                 short   ifru_flags;
     242             :                 int     ifru_flags6;
     243             :                 int     ifru_metric;
     244             :                 caddr_t ifru_data;
     245             :                 struct in6_addrlifetime ifru_lifetime;
     246             :                 struct in6_ifstat ifru_stat;
     247             :                 struct icmp6_ifstat ifru_icmp6stat;
     248             :         } ifr_ifru;
     249             : };
     250             : 
     251             : struct  in6_aliasreq {
     252             :         char    ifra_name[IFNAMSIZ];
     253             :         union {
     254             :                 struct  sockaddr_in6 ifrau_addr;
     255             :                 int     ifrau_align;
     256             :          } ifra_ifrau;
     257             : #ifndef ifra_addr
     258             : #define ifra_addr       ifra_ifrau.ifrau_addr
     259             : #endif
     260             :         struct  sockaddr_in6 ifra_dstaddr;
     261             :         struct  sockaddr_in6 ifra_prefixmask;
     262             :         int     ifra_flags;
     263             :         struct in6_addrlifetime ifra_lifetime;
     264             : };
     265             : 
     266             : /*
     267             :  * Given a pointer to an in6_ifaddr (ifaddr),
     268             :  * return a pointer to the addr as a sockaddr_in6
     269             :  */
     270             : #define IA6_IN6(ia)     (&((ia)->ia_addr.sin6_addr))
     271             : #define IA6_DSTIN6(ia)  (&((ia)->ia_dstaddr.sin6_addr))
     272             : #define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr))
     273             : #define IA6_SIN6(ia)    (&((ia)->ia_addr))
     274             : #define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr))
     275             : #define IFA_IN6(x)      (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr)
     276             : #define IFA_DSTIN6(x)   (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr)
     277             : 
     278             : #define SIOCDIFADDR_IN6          _IOW('i', 25, struct in6_ifreq)
     279             : #define SIOCAIFADDR_IN6          _IOW('i', 26, struct in6_aliasreq)
     280             : 
     281             : #define SIOCGIFDSTADDR_IN6      _IOWR('i', 34, struct in6_ifreq)
     282             : #define SIOCGIFNETMASK_IN6      _IOWR('i', 37, struct in6_ifreq)
     283             : 
     284             : #define SIOCGIFAFLAG_IN6        _IOWR('i', 73, struct in6_ifreq)
     285             : 
     286             : #define SIOCGIFINFO_IN6         _IOWR('i', 108, struct in6_ndireq)
     287             : #define SIOCGNBRINFO_IN6        _IOWR('i', 78, struct in6_nbrinfo)
     288             : 
     289             : #define SIOCGIFALIFETIME_IN6    _IOWR('i', 81, struct in6_ifreq)
     290             : 
     291             : #define SIOCGETSGCNT_IN6        _IOWR('u', 106, struct sioc_sg_req6)
     292             : #define SIOCGETMIFCNT_IN6       _IOWR('u', 107, struct sioc_mif_req6)
     293             : 
     294             : #define IN6_IFF_ANYCAST         0x01    /* anycast address */
     295             : #define IN6_IFF_TENTATIVE       0x02    /* tentative address */
     296             : #define IN6_IFF_DUPLICATED      0x04    /* DAD detected duplicate */
     297             : #define IN6_IFF_DETACHED        0x08    /* may be detached from the link */
     298             : #define IN6_IFF_DEPRECATED      0x10    /* deprecated address */
     299             : #define IN6_IFF_AUTOCONF        0x40    /* autoconfigurable address. */
     300             : #define IN6_IFF_PRIVACY         0x80    /* RFC 4941 temporary address */
     301             : 
     302             : #ifdef _KERNEL
     303             : #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m)      (       \
     304             :         (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
     305             :         (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
     306             :         (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
     307             :         (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
     308             : 
     309             : #define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b))
     310             : #define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b))
     311             : 
     312             : /*
     313             :  * Multi-cast membership entry.  One for each group/ifp that a PCB
     314             :  * belongs to.
     315             :  */
     316             : struct in6_multi_mship {
     317             :         struct  in6_multi *i6mm_maddr;  /* Multicast address pointer */
     318             :         LIST_ENTRY(in6_multi_mship) i6mm_chain;  /* multicast options chain */
     319             : };
     320             : 
     321             : struct in6_multi {
     322             :         struct ifmaddr          in6m_ifma;   /* Protocol-independent info */
     323             : #define in6m_refcnt             in6m_ifma.ifma_refcnt
     324             : #define in6m_ifidx              in6m_ifma.ifma_ifidx
     325             : 
     326             :         struct sockaddr_in6     in6m_sin;   /* IPv6 multicast address */
     327             : #define in6m_addr               in6m_sin.sin6_addr
     328             : 
     329             :         u_int                   in6m_state; /* state of membership */
     330             :         u_int                   in6m_timer; /* MLD6 membership report timer */
     331             : };
     332             : 
     333             : static __inline struct in6_multi *
     334           0 : ifmatoin6m(struct ifmaddr *ifma)
     335             : {
     336           0 :        return ((struct in6_multi *)(ifma));
     337             : }
     338             : 
     339             : /*
     340             :  * Macros for looking up the in6_multi record for a given IP6 multicast
     341             :  * address on a given interface. If no matching record is found, "in6m"
     342             :  * returns NULL.
     343             :  */
     344             : #define IN6_LOOKUP_MULTI(addr, ifp, in6m)                               \
     345             :         /* struct in6_addr addr; */                                     \
     346             :         /* struct ifnet *ifp; */                                        \
     347             :         /* struct in6_multi *in6m; */                                   \
     348             : do {                                                                    \
     349             :         struct ifmaddr *ifma;                                           \
     350             :                                                                         \
     351             :         (in6m) = NULL;                                                  \
     352             :         TAILQ_FOREACH(ifma, &(ifp)->if_maddrlist, ifma_list)             \
     353             :                 if (ifma->ifma_addr->sa_family == AF_INET6 &&             \
     354             :                     IN6_ARE_ADDR_EQUAL(&ifmatoin6m(ifma)->in6m_addr,     \
     355             :                                        &(addr))) {                  \
     356             :                         (in6m) = ifmatoin6m(ifma);                      \
     357             :                         break;                                          \
     358             :                 }                                                       \
     359             : } while (/* CONSTCOND */ 0)
     360             : 
     361             : struct  in6_multi *in6_addmulti(struct in6_addr *, struct ifnet *, int *);
     362             : void    in6_delmulti(struct in6_multi *);
     363             : int     in6_hasmulti(struct in6_addr *, struct ifnet *);
     364             : struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *, int *);
     365             : void    in6_leavegroup(struct in6_multi_mship *);
     366             : int     in6_control(struct socket *, u_long, caddr_t, struct ifnet *);
     367             : int     in6_ioctl(u_long, caddr_t, struct ifnet *, int);
     368             : int     in6_update_ifa(struct ifnet *, struct in6_aliasreq *,
     369             :         struct in6_ifaddr *);
     370             : void    in6_purgeaddr(struct ifaddr *);
     371             : int     in6if_do_dad(struct ifnet *);
     372             : void    *in6_domifattach(struct ifnet *);
     373             : void    in6_domifdetach(struct ifnet *, void *);
     374             : struct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int);
     375             : struct in6_ifaddr *in6ifa_ifpwithaddr(struct ifnet *, struct in6_addr *);
     376             : int     in6_addr2scopeid(unsigned int, struct in6_addr *);
     377             : int     in6_matchlen(struct in6_addr *, struct in6_addr *);
     378             : void    in6_prefixlen2mask(struct in6_addr *, int);
     379             : void    in6_purgeprefix(struct ifnet *);
     380             : #endif /* _KERNEL */
     381             : 
     382             : #endif /* _NETINET6_IN6_VAR_H_ */

Generated by: LCOV version 1.13