]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet/ip_var.h
xnu-4903.270.47.tar.gz
[apple/xnu.git] / bsd / netinet / ip_var.h
index 99982111d18a2d82a2ed81670211630a53b0c6ed..9c2f730354d82265b16beffe7901192b95186a84 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2014 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2017 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  *
  */
 
 #ifndef _NETINET_IP_VAR_H_
-#define        _NETINET_IP_VAR_H_
+#define _NETINET_IP_VAR_H_
 #include <sys/appleapiopts.h>
 
 /*
  * Overlay for ip header used by other protocols (tcp, udp).
  */
 struct ipovly {
-       u_char  ih_x1[9];               /* (unused) */
-       u_char  ih_pr;                  /* protocol */
-       u_short ih_len;                 /* protocol length */
-       struct  in_addr ih_src;         /* source internet address */
-       struct  in_addr ih_dst;         /* destination internet address */
+       u_char  ih_x1[9];               /* (unused) */
+       u_char  ih_pr;                  /* protocol */
+       u_short ih_len;                 /* protocol length */
+       struct  in_addr ih_src;         /* source internet address */
+       struct  in_addr ih_dst;         /* destination internet address */
 };
 
 #ifdef BSD_KERNEL_PRIVATE
@@ -92,25 +92,25 @@ struct label;
  * be reclaimed if memory becomes tight.
  */
 struct ipq {
-       TAILQ_ENTRY(ipq) ipq_list;      /* to other reass headers */
-       struct mbuf *ipq_frags;         /* to ip headers of fragments */
+       TAILQ_ENTRY(ipq) ipq_list;      /* to other reass headers */
+       struct mbuf *ipq_frags;         /* to ip headers of fragments */
 #if CONFIG_MACF_NET
-       struct label *ipq_label;        /* MAC label */
+       struct label *ipq_label;        /* MAC label */
 #endif /* CONFIG_MACF_NET */
-       u_char  ipq_ttl;                /* time for reass q to live */
-       u_char  ipq_p;                  /* protocol of this fragment */
-       u_short ipq_id;                 /* sequence id for reassembly */
-       struct  in_addr ipq_src, ipq_dst;
-       u_int32_t       ipq_nfrags;     /* # frags in this packet */
-       uint32_t ipq_csum_flags;        /* checksum flags */
-       uint32_t ipq_csum;              /* partial checksum value */
+       u_char  ipq_ttl;                /* time for reass q to live */
+       u_char  ipq_p;                  /* protocol of this fragment */
+       u_short ipq_id;                 /* sequence id for reassembly */
+       struct  in_addr ipq_src, ipq_dst;
+       u_int32_t       ipq_nfrags;     /* # frags in this packet */
+       uint32_t ipq_csum_flags;        /* checksum flags */
+       uint32_t ipq_csum;              /* partial checksum value */
 #if IPDIVERT
 #ifdef IPDIVERT_44
-       u_int32_t ipq_div_info;         /* ipfw divert port & flags */
+       u_int32_t ipq_div_info;         /* ipfw divert port & flags */
 #else /* !IPDIVERT_44 */
-       u_int16_t ipq_divert;           /* ipfw divert port (legacy) */
+       u_int16_t ipq_divert;           /* ipfw divert port (legacy) */
 #endif /* !IPDIVERT_44 */
-       u_int16_t ipq_div_cookie;       /* ipfw divert cookie */
+       u_int16_t ipq_div_cookie;       /* ipfw divert cookie */
 #endif /* IPDIVERT */
 };
 
@@ -121,11 +121,11 @@ struct ipq {
  * is in m_len.
  */
 #endif /* BSD_KERNEL_PRIVATE */
-#define        MAX_IPOPTLEN    40
+#define MAX_IPOPTLEN    40
 #ifdef BSD_KERNEL_PRIVATE
 struct ipoption {
-       struct  in_addr ipopt_dst;      /* first-hop dst if source routed */
-       char    ipopt_list[MAX_IPOPTLEN];       /* options proper */
+       struct  in_addr ipopt_dst;      /* first-hop dst if source routed */
+       char    ipopt_list[MAX_IPOPTLEN];       /* options proper */
 };
 
 /*
@@ -134,107 +134,108 @@ struct ipoption {
  */
 struct ip_moptions {
        decl_lck_mtx_data(, imo_lock);
-       uint32_t imo_refcnt;            /* ref count */
-       uint32_t imo_debug;             /* see ifa_debug flags */
-       struct  ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */
-       u_char  imo_multicast_ttl;      /* TTL for outgoing multicasts */
-       u_char  imo_multicast_loop;     /* 1 => hear sends if a member */
-       u_short imo_num_memberships;    /* no. memberships this socket */
-       u_short imo_max_memberships;    /* max memberships this socket */
-       struct  in_multi **imo_membership;      /* group memberships */
-       struct  in_mfilter *imo_mfilters;       /* source filters */
-       u_int32_t imo_multicast_vif;    /* vif num outgoing multicasts */
-       struct  in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */
-       void (*imo_trace)               /* callback fn for tracing refs */
-           (struct ip_moptions *, int);
+       uint32_t imo_refcnt;            /* ref count */
+       uint32_t imo_debug;             /* see ifa_debug flags */
+       struct  ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */
+       u_char  imo_multicast_ttl;      /* TTL for outgoing multicasts */
+       u_char  imo_multicast_loop;     /* 1 => hear sends if a member */
+       u_short imo_num_memberships;    /* no. memberships this socket */
+       u_short imo_max_memberships;    /* max memberships this socket */
+       struct  in_multi **imo_membership;      /* group memberships */
+       struct  in_mfilter *imo_mfilters;       /* source filters */
+       u_int32_t imo_multicast_vif;    /* vif num outgoing multicasts */
+       struct  in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */
+       void (*imo_trace)               /* callback fn for tracing refs */
+       (struct ip_moptions *, int);
 };
 
-#define        IMO_LOCK_ASSERT_HELD(_imo)                                      \
-       lck_mtx_assert(&(_imo)->imo_lock, LCK_MTX_ASSERT_OWNED)
+#define IMO_LOCK_ASSERT_HELD(_imo)                                      \
+       LCK_MTX_ASSERT(&(_imo)->imo_lock, LCK_MTX_ASSERT_OWNED)
 
-#define        IMO_LOCK_ASSERT_NOTHELD(_imo)                                   \
-       lck_mtx_assert(&(_imo)->imo_lock, LCK_MTX_ASSERT_NOTOWNED)
+#define IMO_LOCK_ASSERT_NOTHELD(_imo)                                   \
+       LCK_MTX_ASSERT(&(_imo)->imo_lock, LCK_MTX_ASSERT_NOTOWNED)
 
-#define        IMO_LOCK(_imo)                                                  \
+#define IMO_LOCK(_imo)                                                  \
        lck_mtx_lock(&(_imo)->imo_lock)
 
-#define        IMO_LOCK_SPIN(_imo)                                             \
+#define IMO_LOCK_SPIN(_imo)                                             \
        lck_mtx_lock_spin(&(_imo)->imo_lock)
 
-#define        IMO_CONVERT_LOCK(_imo) do {                                     \
-       IMO_LOCK_ASSERT_HELD(_imo);                                     \
-       lck_mtx_convert_spin(&(_imo)->imo_lock);                        \
+#define IMO_CONVERT_LOCK(_imo) do {                                     \
+       IMO_LOCK_ASSERT_HELD(_imo);                                     \
+       lck_mtx_convert_spin(&(_imo)->imo_lock);                        \
 } while (0)
 
-#define        IMO_UNLOCK(_imo)                                                \
+#define IMO_UNLOCK(_imo)                                                \
        lck_mtx_unlock(&(_imo)->imo_lock)
 
-#define        IMO_ADDREF(_imo)                                                \
+#define IMO_ADDREF(_imo)                                                \
        imo_addref(_imo, 0)
 
-#define        IMO_ADDREF_LOCKED(_imo)                                         \
+#define IMO_ADDREF_LOCKED(_imo)                                         \
        imo_addref(_imo, 1)
 
-#define        IMO_REMREF(_imo)                                                \
+#define IMO_REMREF(_imo)                                                \
        imo_remref(_imo)
 
 /* mbuf tag for ip_forwarding info */
 struct ip_fwd_tag {
-       struct sockaddr_in *next_hop;   /* next_hop */
+       struct sockaddr_in *next_hop;   /* next_hop */
 };
 #endif /* BSD_KERNEL_PRIVATE */
 
-struct ipstat {
-       u_int32_t ips_total;            /* total packets received */
-       u_int32_t ips_badsum;           /* checksum bad */
-       u_int32_t ips_tooshort;         /* packet too short */
-       u_int32_t ips_toosmall;         /* not enough data */
-       u_int32_t ips_badhlen;          /* ip header length < data size */
-       u_int32_t ips_badlen;           /* ip length < ip header length */
-       u_int32_t ips_fragments;        /* fragments received */
-       u_int32_t ips_fragdropped;      /* frags dropped (dups, out of space) */
-       u_int32_t ips_fragtimeout;      /* fragments timed out */
-       u_int32_t ips_forward;          /* packets forwarded */
-       u_int32_t ips_fastforward;      /* packets fast forwarded */
-       u_int32_t ips_cantforward;      /* packets rcvd for unreachable dest */
-       u_int32_t ips_redirectsent;     /* packets forwarded on same net */
-       u_int32_t ips_noproto;          /* unknown or unsupported protocol */
-       u_int32_t ips_delivered;        /* datagrams delivered to upper level */
-       u_int32_t ips_localout;         /* total ip packets generated here */
-       u_int32_t ips_odropped;         /* lost packets due to nobufs, etc. */
-       u_int32_t ips_reassembled;      /* total packets reassembled ok */
-       u_int32_t ips_fragmented;       /* datagrams successfully fragmented */
-       u_int32_t ips_ofragments;       /* output fragments created */
-       u_int32_t ips_cantfrag;         /* don't fragment flag was set, etc. */
-       u_int32_t ips_badoptions;       /* error in option processing */
-       u_int32_t ips_noroute;          /* packets discarded due to no route */
-       u_int32_t ips_badvers;          /* ip version != 4 */
-       u_int32_t ips_rawout;           /* total raw ip packets generated */
-       u_int32_t ips_toolong;          /* ip length > max ip packet size */
-       u_int32_t ips_notmember;        /* multicasts for unregistered grps */
-       u_int32_t ips_nogif;            /* no match gif found */
-       u_int32_t ips_badaddr;          /* invalid address on header */
-       u_int32_t ips_pktdropcntrl;     /* pkt dropped, no mbufs for ctl data */
-       u_int32_t ips_rcv_swcsum;       /* ip hdr swcksum (inbound), packets */
-       u_int32_t ips_rcv_swcsum_bytes; /* ip hdr swcksum (inbound), bytes */
-       u_int32_t ips_snd_swcsum;       /* ip hdr swcksum (outbound), packets */
-       u_int32_t ips_snd_swcsum_bytes; /* ip hdr swcksum (outbound), bytes */
-       u_int32_t ips_adj;              /* total packets trimmed/adjusted */
-       u_int32_t ips_adj_hwcsum_clr;   /* hwcksum discarded during adj */
-       u_int32_t ips_rxc_collisions;   /* rx chaining collisions */
-       u_int32_t ips_rxc_chained;      /* rx chains */
-       u_int32_t ips_rxc_notchain;     /* rx bypassed chaining */
-       u_int32_t ips_rxc_chainsz_gt2;  /* rx chain size greater than 2 */
+struct  ipstat {
+       u_int32_t ips_total;            /* total packets received */
+       u_int32_t ips_badsum;           /* checksum bad */
+       u_int32_t ips_tooshort;         /* packet too short */
+       u_int32_t ips_toosmall;         /* not enough data */
+       u_int32_t ips_badhlen;          /* ip header length < data size */
+       u_int32_t ips_badlen;           /* ip length < ip header length */
+       u_int32_t ips_fragments;        /* fragments received */
+       u_int32_t ips_fragdropped;      /* frags dropped (dups, out of space) */
+       u_int32_t ips_fragtimeout;      /* fragments timed out */
+       u_int32_t ips_forward;          /* packets forwarded */
+       u_int32_t ips_fastforward;      /* packets fast forwarded */
+       u_int32_t ips_cantforward;      /* packets rcvd for unreachable dest */
+       u_int32_t ips_redirectsent;     /* packets forwarded on same net */
+       u_int32_t ips_noproto;          /* unknown or unsupported protocol */
+       u_int32_t ips_delivered;        /* datagrams delivered to upper level */
+       u_int32_t ips_localout;         /* total ip packets generated here */
+       u_int32_t ips_odropped;         /* lost packets due to nobufs, etc. */
+       u_int32_t ips_reassembled;      /* total packets reassembled ok */
+       u_int32_t ips_fragmented;       /* datagrams successfully fragmented */
+       u_int32_t ips_ofragments;       /* output fragments created */
+       u_int32_t ips_cantfrag;         /* don't fragment flag was set, etc. */
+       u_int32_t ips_badoptions;       /* error in option processing */
+       u_int32_t ips_noroute;          /* packets discarded due to no route */
+       u_int32_t ips_badvers;          /* ip version != 4 */
+       u_int32_t ips_rawout;           /* total raw ip packets generated */
+       u_int32_t ips_toolong;          /* ip length > max ip packet size */
+       u_int32_t ips_notmember;        /* multicasts for unregistered grps */
+       u_int32_t ips_nogif;            /* no match gif found */
+       u_int32_t ips_badaddr;          /* invalid address on header */
+       u_int32_t ips_pktdropcntrl;     /* pkt dropped, no mbufs for ctl data */
+       u_int32_t ips_rcv_swcsum;       /* ip hdr swcksum (inbound), packets */
+       u_int32_t ips_rcv_swcsum_bytes; /* ip hdr swcksum (inbound), bytes */
+       u_int32_t ips_snd_swcsum;       /* ip hdr swcksum (outbound), packets */
+       u_int32_t ips_snd_swcsum_bytes; /* ip hdr swcksum (outbound), bytes */
+       u_int32_t ips_adj;              /* total packets trimmed/adjusted */
+       u_int32_t ips_adj_hwcsum_clr;   /* hwcksum discarded during adj */
+       u_int32_t ips_rxc_collisions;   /* rx chaining collisions */
+       u_int32_t ips_rxc_chained;      /* rx chains */
+       u_int32_t ips_rxc_notchain;     /* rx bypassed chaining */
+       u_int32_t ips_rxc_chainsz_gt2;  /* rx chain size greater than 2 */
        u_int32_t ips_rxc_chainsz_gt4;  /* rx chain size greater than 4 */
-       u_int32_t ips_rxc_notlist;      /* count of pkts through ip_input */
-
+       u_int32_t ips_rxc_notlist;      /* count of pkts through ip_input */
+       u_int32_t ips_raw_sappend_fail; /* sock append failed */
+       u_int32_t ips_necp_policy_drop; /* NECP policy related drop */
 };
 
 struct ip_linklocal_stat {
-       u_int32_t       iplls_in_total;
-       u_int32_t       iplls_in_badttl;
-       u_int32_t       iplls_out_total;
-       u_int32_t       iplls_out_badttl;
+       u_int32_t       iplls_in_total;
+       u_int32_t       iplls_in_badttl;
+       u_int32_t       iplls_out_total;
+       u_int32_t       iplls_out_badttl;
 };
 
 #ifdef KERNEL_PRIVATE
@@ -245,14 +246,15 @@ struct ip_moptions;
 
 #ifdef BSD_KERNEL_PRIVATE
 /* flags passed to ip_output as last parameter */
-#define        IP_FORWARDING   0x1             /* most of ip header exists */
-#define        IP_RAWOUTPUT    0x2             /* raw ip header exists */
-#define        IP_NOIPSEC      0x4             /* No IPSec processing */
-#define        IP_ROUTETOIF    SO_DONTROUTE    /* bypass routing tables (0x0010) */
-#define        IP_ALLOWBROADCAST SO_BROADCAST  /* can send broadcast pkts (0x0020) */
-#define        IP_OUTARGS      0x100           /* has ancillary output info */
+#define IP_FORWARDING   0x1             /* most of ip header exists */
+#define IP_RAWOUTPUT    0x2             /* raw ip header exists */
+#define IP_NOIPSEC      0x4             /* No IPSec processing */
+#define IP_ROUTETOIF    SO_DONTROUTE    /* bypass routing tables (0x0010) */
+#define IP_ALLOWBROADCAST SO_BROADCAST  /* can send broadcast pkts (0x0020) */
+#define IP_OUTARGS      0x100           /* has ancillary output info */
 
-#define        IP_HDR_ALIGNED_P(_ip)   ((((uintptr_t)(_ip)) & ((uintptr_t)3)) == 0)
+#define IP_HDR_ALIGNED_P(_ip)   ((((uintptr_t)(_ip)) & ((uintptr_t)3)) == 0)
+#define IP_OFF_IS_ATOMIC(_ip_off) ((_ip_off & (IP_DF | IP_MF | IP_OFFMASK)) == IP_DF)
 
 /*
  * On platforms which require strict alignment (currently for anything but
@@ -260,13 +262,13 @@ struct ip_moptions;
  * is 32-bit aligned, and assert otherwise.
  */
 #if defined(__i386__) || defined(__x86_64__)
-#define        IP_HDR_STRICT_ALIGNMENT_CHECK(_ip) do { } while (0)
+#define IP_HDR_STRICT_ALIGNMENT_CHECK(_ip) do { } while (0)
 #else /* !__i386__ && !__x86_64__ */
-#define        IP_HDR_STRICT_ALIGNMENT_CHECK(_ip) do {                         \
-       if (!IP_HDR_ALIGNED_P(_ip)) {                                   \
-               panic_plain("\n%s: Unaligned IP header %p\n",           \
-                   __func__, _ip);                                     \
-       }                                                               \
+#define IP_HDR_STRICT_ALIGNMENT_CHECK(_ip) do {                         \
+       if (!IP_HDR_ALIGNED_P(_ip)) {                                   \
+               panic_plain("\n%s: Unaligned IP header %p\n",           \
+                   __func__, _ip);                                     \
+       }                                                               \
 } while (0)
 #endif /* !__i386__ && !__x86_64__ */
 
@@ -284,28 +286,31 @@ struct sockopt;
  * ipoa_retflags any additional information regarding the error.
  */
 struct ip_out_args {
-       unsigned int    ipoa_boundif;   /* boundif interface index */
-       struct flowadv  ipoa_flowadv;   /* flow advisory code */
-       u_int32_t       ipoa_flags;     /* IPOAF output flags (see below) */
-#define        IPOAF_SELECT_SRCIF      0x00000001      /* src interface selection */
-#define        IPOAF_BOUND_IF          0x00000002      /* boundif value is valid */
-#define        IPOAF_BOUND_SRCADDR     0x00000004      /* bound to src address */
-#define        IPOAF_NO_CELLULAR       0x00000010      /* skip IFT_CELLULAR */
-#define        IPOAF_NO_EXPENSIVE      0x00000020      /* skip IFT_EXPENSIVE */
-#define        IPOAF_AWDL_UNRESTRICTED 0x00000040      /* can send over 
-                                                  AWDL_RESTRICTED */
-       u_int32_t       ipoa_retflags;  /* IPOARF return flags (see below) */
-#define        IPOARF_IFDENIED 0x00000001      /* denied access to interface */
+       unsigned int    ipoa_boundif;   /* boundif interface index */
+       struct flowadv  ipoa_flowadv;   /* flow advisory code */
+       u_int32_t       ipoa_flags;     /* IPOAF output flags (see below) */
+#define IPOAF_SELECT_SRCIF      0x00000001      /* src interface selection */
+#define IPOAF_BOUND_IF          0x00000002      /* boundif value is valid */
+#define IPOAF_BOUND_SRCADDR     0x00000004      /* bound to src address */
+#define IPOAF_NO_CELLULAR       0x00000010      /* skip IFT_CELLULAR */
+#define IPOAF_NO_EXPENSIVE      0x00000020      /* skip IFT_EXPENSIVE */
+#define IPOAF_AWDL_UNRESTRICTED 0x00000040      /* can send over
+                                                *  AWDL_RESTRICTED */
+#define IPOAF_QOSMARKING_ALLOWED        0x00000080      /* policy allows Fastlane DSCP marking */
+       u_int32_t       ipoa_retflags;  /* IPOARF return flags (see below) */
+#define IPOARF_IFDENIED 0x00000001      /* denied access to interface */
+       int             ipoa_sotc;      /* traffic class for Fastlane DSCP mapping */
+       int             ipoa_netsvctype; /* network service type */
 };
 
 extern struct ipstat ipstat;
 extern int ip_use_randomid;
-extern u_short ip_id;                  /* ip packet ctr, for ids */
-extern int ip_defttl;                  /* default IP ttl */
-extern int ipforwarding;               /* ip forwarding */
+extern u_short ip_id;                   /* ip packet ctr, for ids */
+extern int ip_defttl;                   /* default IP ttl */
+extern int ipforwarding;                /* ip forwarding */
+extern int rfc6864;
 extern struct protosw *ip_protox[];
 extern struct pr_usrreqs rip_usrreqs;
-extern int ip_doscopedroute;
 
 extern void ip_moptions_init(void);
 extern struct ip_moptions *ip_allocmoptions(int);
@@ -331,7 +336,7 @@ extern struct in_ifaddr *ip_rtaddr(struct in_addr);
 extern int ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
     struct mbuf *);
 extern struct mbuf *ip_srcroute(void);
-extern void  ip_stripoptions(struct mbuf *, struct mbuf *);
+extern void  ip_stripoptions(struct mbuf *);
 extern void ip_initid(void);
 extern u_int16_t ip_randomid(void);
 extern void ip_proto_dispatch_in_wrapper(struct mbuf *, int, u_int8_t);
@@ -343,7 +348,7 @@ extern int ip_getsrcifaddr_info(struct mbuf *, uint32_t *, uint32_t *);
 extern int ip_getdstifaddr_info(struct mbuf *, uint32_t *, uint32_t *);
 
 extern int rip_ctloutput(struct socket *, struct sockopt *);
-extern void rip_ctlinput(int, struct sockaddr *, void *);
+extern void rip_ctlinput(int, struct sockaddr *, void *, struct ifnet *);
 extern void rip_init(struct protosw *, struct domain *);
 extern void rip_input(struct mbuf *, int);
 extern int rip_output(struct mbuf *, struct socket *, u_int32_t, struct mbuf *);