/*
- * Copyright (c) 2000-2014 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2016 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#include <sys/tree.h>
#include <kern/locks.h>
#include <kern/zalloc.h>
+#include <netinet/in_stat.h>
#endif /* BSD_KERNEL_PRIVATE */
+#if IPSEC
#include <netinet6/ipsec.h> /* for IPSEC */
+#endif /* IPSEC */
+
#if NECP
#include <net/necp.h>
#endif
-#if IPSEC
-#include <netinet6/ipsec.h> /* for IPSEC */
-#endif
#ifdef BSD_KERNEL_PRIVATE
/*
char *inp_account;
} inp_necp_attributes;
struct necp_inpcb_result inp_policyresult;
+ uuid_t necp_client_uuid;
+ void (*necp_cb)(void *, int, struct necp_client_flow *);
#endif
+ u_char *inp_keepalive_data; /* for keepalive offload */
+ u_int8_t inp_keepalive_datalen; /* keepalive data length */
+ u_int8_t inp_keepalive_type; /* type of application */
+ u_int16_t inp_keepalive_interval; /* keepalive interval */
+ uint32_t inp_nstat_refcnt __attribute__((aligned(4)));
struct inp_stat *inp_stat;
struct inp_stat *inp_cstat; /* cellular data */
struct inp_stat *inp_wstat; /* Wi-Fi data */
u_int8_t inp_cstat_store[sizeof (struct inp_stat) + sizeof (u_int64_t)];
u_int8_t inp_wstat_store[sizeof (struct inp_stat) + sizeof (u_int64_t)];
u_int8_t inp_Wstat_store[sizeof (struct inp_stat) + sizeof (u_int64_t)];
- uint32_t inp_nstat_refcnt __attribute__((aligned(4)));
+ activity_bitmap_t inp_nw_activity;
+ u_int64_t inp_start_timestamp;
};
#define INP_ADD_STAT(_inp, _cnt_cellular, _cnt_wifi, _cnt_wired, _a, _n)\
u_quad_t xi_alignment_hack;
};
+#if !CONFIG_EMBEDDED
struct inpcb64_list_entry {
u_int64_t le_next;
u_int64_t le_prev;
struct xsocket64 xi_socket;
u_quad_t xi_alignment_hack;
};
+#endif /* !CONFIG_EMBEDDED */
#ifdef PRIVATE
struct xinpcb_list_entry {
#if IPSEC
#define in6p_sp inp_sp
#endif /* IPSEC */
+#define INP_INC_IFNET_STAT(_inp_, _stat_) { \
+ if ((_inp_)->inp_last_outifp != NULL) { \
+ if ((_inp_)->inp_vflag & INP_IPV6) { \
+ (_inp_)->inp_last_outifp->if_ipv6_stat->_stat_++;\
+ } else { \
+ (_inp_)->inp_last_outifp->if_ipv4_stat->_stat_++;\
+ }\
+ }\
+}
struct inpcbport {
LIST_ENTRY(inpcbport) phd_hash;
lck_attr_t *ipi_lock_attr;
lck_grp_t *ipi_lock_grp;
lck_grp_attr_t *ipi_lock_grp_attr;
+
+#define INPCBINFO_UPDATE_MSS 0x1
+#define INPCBINFO_HANDLE_LQM_ABORT 0x2
+ u_int32_t ipi_flags;
};
#define INP_PCBHASH(faddr, lport, fport, mask) \
((_inp)->inp_flags2 & INP2_NO_IFF_EXPENSIVE)
#define INP_AWDL_UNRESTRICTED(_inp) \
((_inp)->inp_flags2 & INP2_AWDL_UNRESTRICTED)
+#define INP_INTCOPROC_ALLOWED(_inp) \
+ ((_inp)->inp_flags2 & INP2_INTCOPROC_ALLOWED)
#endif /* BSD_KERNEL_PRIVATE */
#define IN6P_RTHDR 0x00100000 /* receive routing header */
#define IN6P_RTHDRDSTOPTS 0x00200000 /* receive dstoptions before rthdr */
#define IN6P_TCLASS 0x00400000 /* receive traffic class value */
+#define INP_RECVTOS IN6P_TCLASS /* receive incoming IP TOS */
#define IN6P_AUTOFLOWLABEL 0x00800000 /* attach flowlabel automatically */
#endif /* BSD_KERNEL_PRIVATE */
#define INP2_NO_IFF_EXPENSIVE 0x00000008 /* do not use expensive interface */
#define INP2_INHASHLIST 0x00000010 /* pcb is in inp_hash list */
#define INP2_AWDL_UNRESTRICTED 0x00000020 /* AWDL restricted mode allowed */
+#define INP2_KEEPALIVE_OFFLOAD 0x00000040 /* Enable UDP or TCP keepalive offload */
+#define INP2_INTCOPROC_ALLOWED 0x00000080 /* Allow communication via internal co-processor interfaces */
+#define INP2_CONNECT_IN_PROGRESS 0x00000100 /* A connect call is in progress, so binds are intermediate steps */
/*
* Flags passed to in_pcblookup*() functions.
extern void in_pcbdisconnect(struct inpcb *);
extern int in_pcbinshash(struct inpcb *, int);
extern int in_pcbladdr(struct inpcb *, struct sockaddr *, struct in_addr *,
- unsigned int, struct ifnet **);
+ unsigned int, struct ifnet **, int);
extern struct inpcb *in_pcblookup_local(struct inpcbinfo *, struct in_addr,
u_int, int);
extern struct inpcb *in_pcblookup_local_and_cleanup(struct inpcbinfo *,
void (*)(struct inpcb *, int));
extern void in_pcbrehash(struct inpcb *);
extern int in_getpeeraddr(struct socket *, struct sockaddr **);
-extern int in_getpeeraddr_s(struct socket *, struct sockaddr_storage *);
extern int in_getsockaddr(struct socket *, struct sockaddr **);
-extern int in_getsockaddr_s(struct socket *, struct sockaddr_storage *);
+extern int in_getsockaddr_s(struct socket *, struct sockaddr_in *);
extern int in_pcb_checkstate(struct inpcb *, int, int);
extern void in_pcbremlists(struct inpcb *);
extern void inpcb_to_compat(struct inpcb *, struct inpcb_compat *);
+#if !CONFIG_EMBEDDED
extern void inpcb_to_xinpcb64(struct inpcb *, struct xinpcb64 *);
+#endif
+
extern int get_pcblist_n(short, struct sysctl_req *, struct inpcbinfo *);
-#define INPCB_GET_PORTS_USED_WILDCARDOK 0x1
-#define INPCB_GET_PORTS_USED_NOWAKEUPOK 0x2
+#define INPCB_GET_PORTS_USED_WILDCARDOK 0x01
+#define INPCB_GET_PORTS_USED_NOWAKEUPOK 0x02
+#define INPCB_GET_PORTS_USED_RECVANYIFONLY 0x04
+#define INPCB_GET_PORTS_USED_EXTBGIDLEONLY 0x08
+#define INPCB_GET_PORTS_USED_ACTIVEONLY 0x10
+
extern void inpcb_get_ports_used(u_int32_t, int, u_int32_t, bitstr_t *,
struct inpcbinfo *);
#define INPCB_OPPORTUNISTIC_THROTTLEON 0x0001
extern void inp_set_awdl_unrestricted(struct inpcb *);
extern boolean_t inp_get_awdl_unrestricted(struct inpcb *);
extern void inp_clear_awdl_unrestricted(struct inpcb *);
+extern void inp_set_intcoproc_allowed(struct inpcb *);
+extern boolean_t inp_get_intcoproc_allowed(struct inpcb *);
+extern void inp_clear_intcoproc_allowed(struct inpcb *);
#if NECP
extern void inp_update_necp_policy(struct inpcb *, struct sockaddr *, struct sockaddr *, u_int);
extern void inp_set_want_app_policy(struct inpcb *);
extern int inp_update_policy(struct inpcb *);
extern boolean_t inp_restricted_recv(struct inpcb *, struct ifnet *);
extern boolean_t inp_restricted_send(struct inpcb *, struct ifnet *);
+extern void inp_incr_sndbytes_total(struct socket *, int);
+extern void inp_decr_sndbytes_total(struct socket *, int);
+extern void inp_count_sndbytes(struct inpcb *, u_int32_t);
+extern void inp_incr_sndbytes_unsent(struct socket *, int32_t);
+extern void inp_decr_sndbytes_unsent(struct socket *, int32_t);
+extern int32_t inp_get_sndbytes_allunsent(struct socket *, u_int32_t);
+extern void inp_decr_sndbytes_allunsent(struct socket *, u_int32_t);
+extern void inp_set_activity_bitmap(struct inpcb *inp);
+extern void inp_get_activity_bitmap(struct inpcb *inp, activity_bitmap_t *b);
#endif /* BSD_KERNEL_PRIVATE */
#ifdef KERNEL_PRIVATE
/* exported for PPP */