]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/ntstat.h
xnu-1699.22.73.tar.gz
[apple/xnu.git] / bsd / net / ntstat.h
diff --git a/bsd/net/ntstat.h b/bsd/net/ntstat.h
new file mode 100644 (file)
index 0000000..4bbb3dc
--- /dev/null
@@ -0,0 +1,348 @@
+/*
+ * Copyright (c) 2010-2011 Apple Inc. All rights reserved.
+ *
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
+ */
+#ifndef __NTSTAT_H__
+#define __NTSTAT_H__
+#include <netinet/in.h>
+
+#ifdef PRIVATE
+#pragma pack(push, 4)
+#pragma mark -- Common Data Structures --
+
+#define __NSTAT_REVISION__     1
+
+typedef        u_int32_t       nstat_provider_id_t;
+typedef        u_int32_t       nstat_src_ref_t;
+
+typedef struct nstat_counts
+{
+       /* Counters */
+       u_int64_t       nstat_rxpackets __attribute__((aligned(8)));
+       u_int64_t       nstat_rxbytes   __attribute__((aligned(8)));
+       u_int64_t       nstat_txpackets __attribute__((aligned(8)));
+       u_int64_t       nstat_txbytes   __attribute__((aligned(8)));
+
+       u_int32_t       nstat_rxduplicatebytes;
+       u_int32_t       nstat_rxoutoforderbytes;
+       u_int32_t       nstat_txretransmit;
+       
+       u_int32_t       nstat_connectattempts;
+       u_int32_t       nstat_connectsuccesses;
+       
+       u_int32_t       nstat_min_rtt;
+       u_int32_t       nstat_avg_rtt;
+       u_int32_t       nstat_var_rtt;
+} nstat_counts;
+
+#pragma mark -- Network Statistics Providers --
+
+enum
+{
+       NSTAT_PROVIDER_ROUTE    = 1
+       ,NSTAT_PROVIDER_TCP             = 2
+       ,NSTAT_PROVIDER_UDP             = 3
+};
+
+typedef struct nstat_route_add_param
+{
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } dst;
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } mask;
+       u_int32_t       ifindex;
+} nstat_route_add_param;
+
+typedef struct nstat_tcp_add_param
+{
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } local;
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } remote;
+} nstat_tcp_add_param;
+
+typedef struct nstat_tcp_descriptor
+{
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } local;
+       
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } remote;
+       
+       u_int32_t       ifindex;
+       
+       u_int32_t       state;
+       
+       u_int32_t       sndbufsize;
+       u_int32_t       sndbufused;
+       u_int32_t       rcvbufsize;
+       u_int32_t       rcvbufused;
+       u_int32_t       txunacked;
+       u_int32_t       txwindow;
+       u_int32_t       txcwindow;
+       
+       u_int64_t       upid;
+       u_int32_t       pid;
+       char            pname[64];
+} nstat_tcp_descriptor;
+
+typedef struct nstat_tcp_add_param     nstat_udp_add_param;
+
+typedef struct nstat_udp_descriptor
+{
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } local;
+       
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+       } remote;
+       
+       u_int32_t       ifindex;
+       
+       u_int32_t       rcvbufsize;
+       u_int32_t       rcvbufused;
+       
+       u_int64_t       upid;
+       u_int32_t       pid;
+       char            pname[64];
+} nstat_udp_descriptor;
+
+typedef struct nstat_route_descriptor
+{
+       u_int64_t       id;
+       u_int64_t       parent_id;
+       u_int64_t       gateway_id;
+       
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+               struct sockaddr         sa;
+       } dst;
+       
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+               struct sockaddr         sa;
+       } mask;
+       
+       union
+       {
+               struct sockaddr_in      v4;
+               struct sockaddr_in6     v6;
+               struct sockaddr         sa;
+       } gateway;
+       
+       u_int32_t       ifindex;
+       u_int32_t       flags;
+       
+} nstat_route_descriptor;
+
+#pragma mark -- Network Statistics User Client --
+
+#define        NET_STAT_CONTROL_NAME   "com.apple.network.statistics"
+
+enum
+{
+       // generice respnse messages
+       NSTAT_MSG_TYPE_SUCCESS                  = 0
+       ,NSTAT_MSG_TYPE_ERROR                   = 1
+       
+       // Requests
+       ,NSTAT_MSG_TYPE_ADD_SRC                 = 1001
+       ,NSTAT_MSG_TYPE_ADD_ALL_SRCS    = 1002
+       ,NSTAT_MSG_TYPE_REM_SRC                 = 1003
+       ,NSTAT_MSG_TYPE_QUERY_SRC               = 1004
+       ,NSTAT_MSG_TYPE_GET_SRC_DESC    = 1005
+       
+       // Responses/Notfications
+       ,NSTAT_MSG_TYPE_SRC_ADDED               = 10001
+       ,NSTAT_MSG_TYPE_SRC_REMOVED             = 10002
+       ,NSTAT_MSG_TYPE_SRC_DESC                = 10003
+       ,NSTAT_MSG_TYPE_SRC_COUNTS              = 10004
+};
+
+enum
+{
+       NSTAT_SRC_REF_ALL               = 0xffffffff
+       ,NSTAT_SRC_REF_INVALID  = 0
+};
+
+typedef struct nstat_msg_hdr
+{
+       u_int64_t       context;
+       u_int32_t       type;
+       u_int32_t       pad; // unused for now
+} nstat_msg_hdr;
+
+typedef struct nstat_msg_error
+{
+       nstat_msg_hdr   hdr;
+       u_int32_t               error;  // errno error
+} nstat_msg_error;
+
+typedef struct nstat_msg_add_src
+{
+       nstat_msg_hdr           hdr;
+       nstat_provider_id_t     provider;
+       u_int8_t                        param[];
+} nstat_msg_add_src_req;
+
+typedef struct nstat_msg_add_all_srcs
+{
+       nstat_msg_hdr           hdr;
+       nstat_provider_id_t     provider;
+} nstat_msg_add_all_srcs;
+
+typedef struct nstat_msg_src_added
+{
+       nstat_msg_hdr           hdr;
+       nstat_provider_id_t     provider;
+       nstat_src_ref_t         srcref;
+} nstat_msg_src_added;
+
+typedef struct nstat_msg_rem_src
+{
+       nstat_msg_hdr           hdr;
+       nstat_src_ref_t         srcref;
+} nstat_msg_rem_src_req;
+
+typedef struct nstat_msg_get_src_description
+{
+       nstat_msg_hdr           hdr;
+       nstat_src_ref_t         srcref;
+} nstat_msg_get_src_description;
+
+typedef struct nstat_msg_src_description
+{
+       nstat_msg_hdr           hdr;
+       nstat_src_ref_t         srcref;
+       nstat_provider_id_t     provider;
+       u_int8_t                        data[];
+} nstat_msg_src_description;
+
+typedef struct nstat_msg_query_src
+{
+       nstat_msg_hdr           hdr;
+       nstat_src_ref_t         srcref;
+} nstat_msg_query_src_req;
+
+typedef struct nstat_msg_src_counts
+{
+       nstat_msg_hdr           hdr;
+       nstat_src_ref_t         srcref;
+       nstat_counts            counts;
+} nstat_msg_src_counts;
+
+typedef struct nstat_msg_src_removed
+{
+       nstat_msg_hdr           hdr;
+       nstat_src_ref_t         srcref;
+} nstat_msg_src_removed;
+
+#pragma pack(pop)
+
+#endif /* PRIVATE */
+
+#ifdef XNU_KERNEL_PRIVATE
+#include <sys/mcache.h>
+
+#pragma mark -- Generic Network Statistics Provider --
+
+typedef        void *  nstat_provider_cookie_t;
+
+#pragma mark -- Route Statistics Gathering Functions --
+struct rtentry;
+
+enum
+{
+       NSTAT_TX_FLAG_RETRANSMIT        = 1
+};
+
+enum
+{
+       NSTAT_RX_FLAG_DUPLICATE         = 1,
+       NSTAT_RX_FLAG_OUT_OF_ORDER      = 2
+};
+
+// indicates whether or not collection of statistics is enabled
+extern int     nstat_collect;
+
+// Route collection routines
+void nstat_route_connect_attempt(struct rtentry *rte);
+void nstat_route_connect_success(struct rtentry *rte);
+void nstat_route_tx(struct rtentry *rte, u_int32_t packets, u_int32_t bytes, u_int32_t flags);
+void nstat_route_rx(struct rtentry *rte, u_int32_t packets, u_int32_t bytes, u_int32_t flags);
+void nstat_route_rtt(struct rtentry *rte, u_int32_t rtt, u_int32_t rtt_var);
+void nstat_route_detach(struct rtentry *rte);
+
+// watcher support
+struct inpcb;
+void nstat_tcp_new_pcb(struct inpcb *inp);
+void nstat_udp_new_pcb(struct inpcb *inp);
+void nstat_route_new_entry(struct rtentry *rt);
+
+// locked_add_64 uses atomic operations on 32bit so the 64bit
+// value can be properly read. The values are only ever incremented
+// while under the socket lock, so on 64bit we don't actually need
+// atomic operations to increment.
+#if defined(__LP64__)
+#define        locked_add_64(__addr, __count) do { \
+       *(__addr) += (__count); \
+} while (0)
+#else
+#define        locked_add_64(__addr, __count) do { \
+       atomic_add_64((__addr), (__count)); \
+} while (0)
+#endif
+
+#endif /* XNU_KERNEL_PRIVATE */
+
+#endif /* __NTSTAT_H__ */