summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorapersson <none@none>2006-12-19 17:33:00 -0800
committerapersson <none@none>2006-12-19 17:33:00 -0800
commit3173664e967186de0a5f0e61548c25996fa6d37f (patch)
tree8ecbca3fbb92ed52c2102d0d7a21302f61ae09d1 /usr/src
parent2568f901e23df0fb67939d5e72ef503eca7376d7 (diff)
downloadillumos-joyent-3173664e967186de0a5f0e61548c25996fa6d37f.tar.gz
PSARC 2006/314 Updated MIBs
6501024 Add support for new IP/TCP/UDP MIBs
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/cmd-inet/usr.bin/netstat/netstat.c16
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c162
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.c6
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h37
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/in.routed/defs.h6
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/in.routed/rdisc.c92
-rw-r--r--usr/src/head/Makefile2
-rw-r--r--usr/src/head/protocols/ndpd.h148
-rw-r--r--usr/src/head/protocols/routed.h28
-rw-r--r--usr/src/pkgdefs/SUNWhea/prototype_com1
-rw-r--r--usr/src/uts/common/inet/ip.h10
-rw-r--r--usr/src/uts/common/inet/ip/ip.c1212
-rw-r--r--usr/src/uts/common/inet/ip/ip6.c443
-rw-r--r--usr/src/uts/common/inet/ip/ip_ftable.c4
-rw-r--r--usr/src/uts/common/inet/ip/ip_if.c104
-rw-r--r--usr/src/uts/common/inet/ip/ip_ndp.c2
-rw-r--r--usr/src/uts/common/inet/ip/spd.c7
-rw-r--r--usr/src/uts/common/inet/ip6.h2
-rw-r--r--usr/src/uts/common/inet/mib2.h318
-rw-r--r--usr/src/uts/common/inet/sctp/sctp_hash.c9
-rw-r--r--usr/src/uts/common/inet/sctp/sctp_input.c20
-rw-r--r--usr/src/uts/common/inet/tcp.h1
-rw-r--r--usr/src/uts/common/inet/tcp/tcp.c59
-rw-r--r--usr/src/uts/common/inet/udp/udp.c62
-rw-r--r--usr/src/uts/common/inet/udp_impl.h3
25 files changed, 2038 insertions, 716 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.bin/netstat/netstat.c b/usr/src/cmd/cmd-inet/usr.bin/netstat/netstat.c
index 3bfc635214..0a401766da 100644
--- a/usr/src/cmd/cmd-inet/usr.bin/netstat/netstat.c
+++ b/usr/src/cmd/cmd-inet/usr.bin/netstat/netstat.c
@@ -1267,7 +1267,7 @@ mib_item_diff(mib_item_t *item1, mib_item_t *item2) {
MDIFF(d, t2, t1, tcpAttemptFails);
MDIFF(d, t2, t1, tcpEstabResets);
d->tcpCurrEstab = t2->tcpCurrEstab;
- MDIFF(d, t2, t1, tcpOutSegs);
+ MDIFF(d, t2, t1, tcpHCOutSegs);
MDIFF(d, t2, t1, tcpOutDataSegs);
MDIFF(d, t2, t1, tcpOutDataBytes);
MDIFF(d, t2, t1, tcpRetransSegs);
@@ -1280,7 +1280,7 @@ mib_item_diff(mib_item_t *item1, mib_item_t *item2) {
MDIFF(d, t2, t1, tcpOutControl);
MDIFF(d, t2, t1, tcpOutRsts);
MDIFF(d, t2, t1, tcpOutFastRetrans);
- MDIFF(d, t2, t1, tcpInSegs);
+ MDIFF(d, t2, t1, tcpHCInSegs);
MDIFF(d, t2, t1, tcpInAckSegs);
MDIFF(d, t2, t1, tcpInAckBytes);
MDIFF(d, t2, t1, tcpInDupAck);
@@ -1326,9 +1326,9 @@ mib_item_diff(mib_item_t *item1, mib_item_t *item2) {
if (d == NULL)
goto mibdiff_out_of_memory;
diffptr->valp = d;
- MDIFF(d, u2, u1, udpInDatagrams);
+ MDIFF(d, u2, u1, udpHCInDatagrams);
MDIFF(d, u2, u1, udpInErrors);
- MDIFF(d, u2, u1, udpOutDatagrams);
+ MDIFF(d, u2, u1, udpHCOutDatagrams);
MDIFF(d, u2, u1, udpOutErrors);
prevp = diffptr++;
break;
@@ -2267,7 +2267,7 @@ print_tcp_stats(mib2_tcp_t *tcp)
prval("tcpAttemptFails", tcp->tcpAttemptFails);
prval("tcpEstabResets", tcp->tcpEstabResets);
prval("tcpCurrEstab", tcp->tcpCurrEstab);
- prval("tcpOutSegs", tcp->tcpOutSegs);
+ prval64("tcpOutSegs", tcp->tcpHCOutSegs);
prval("tcpOutDataSegs", tcp->tcpOutDataSegs);
prval("tcpOutDataBytes", tcp->tcpOutDataBytes);
prval("tcpRetransSegs", tcp->tcpRetransSegs);
@@ -2280,7 +2280,7 @@ print_tcp_stats(mib2_tcp_t *tcp)
prval("tcpOutControl", tcp->tcpOutControl);
prval("tcpOutRsts", tcp->tcpOutRsts);
prval("tcpOutFastRetrans", tcp->tcpOutFastRetrans);
- prval("tcpInSegs", tcp->tcpInSegs);
+ prval64("tcpInSegs", tcp->tcpHCInSegs);
prval_end();
prval("tcpInAckSegs", tcp->tcpInAckSegs);
prval("tcpInAckBytes", tcp->tcpInAckBytes);
@@ -2318,9 +2318,9 @@ static void
print_udp_stats(mib2_udp_t *udp)
{
prval_init();
- prval("udpInDatagrams", udp->udpInDatagrams);
+ prval64("udpInDatagrams", udp->udpHCInDatagrams);
prval("udpInErrors", udp->udpInErrors);
- prval("udpOutDatagrams", udp->udpOutDatagrams);
+ prval64("udpOutDatagrams", udp->udpHCOutDatagrams);
prval("udpOutErrors", udp->udpOutErrors);
prval_end();
}
diff --git a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c
index 1cfbafa911..2a3507a86d 100644
--- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c
+++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c
@@ -28,6 +28,7 @@
#include "defs.h"
#include "tables.h"
#include <fcntl.h>
+#include <sys/un.h>
static void initlog(void);
static void run_timeouts(void);
@@ -93,6 +94,7 @@ int rtsock = -1; /* Routing socket */
struct rt_msghdr *rt_msg; /* Routing socket message */
struct sockaddr_in6 *rta_gateway; /* RTA_GATEWAY sockaddr */
struct sockaddr_dl *rta_ifp; /* RTA_IFP sockaddr */
+int mibsock = -1; /* mib request socket */
/*
* Return the current time in milliseconds truncated to
@@ -349,7 +351,7 @@ poll_add(int fd)
int i;
int new_num;
struct pollfd *newfds;
-retry:
+
/* Check if already present */
for (i = 0; i < pollfd_num; i++) {
if (pollfds[i].fd == fd)
@@ -370,13 +372,17 @@ retry:
logperror("poll_add: realloc");
return (-1);
}
+
+ newfds[pollfd_num].fd = fd;
+ newfds[pollfd_num++].events = POLLIN;
+
for (i = pollfd_num; i < new_num; i++) {
newfds[i].fd = -1;
newfds[i].events = POLLIN;
}
pollfd_num = new_num;
pollfds = newfds;
- goto retry;
+ return (0);
}
/*
@@ -1379,6 +1385,7 @@ in_signal(int fd)
phyint_delete(pi);
}
+ (void) unlink(NDPD_SNMP_SOCKET);
(void) unlink(PATH_PID);
exit(0);
/* NOTREACHED */
@@ -1508,6 +1515,45 @@ setup_rtsock(void)
return (s);
}
+static int
+setup_mibsock(void)
+{
+ int sock;
+ int ret;
+ int len;
+ struct sockaddr_un laddr;
+
+ sock = socket(AF_UNIX, SOCK_DGRAM, 0);
+ if (sock == -1) {
+ logperror("setup_mibsock: socket(AF_UNIX)");
+ exit(1);
+ }
+
+ bzero(&laddr, sizeof (laddr));
+ laddr.sun_family = AF_UNIX;
+
+ (void) strncpy(laddr.sun_path, NDPD_SNMP_SOCKET,
+ sizeof (laddr.sun_path));
+ len = sizeof (struct sockaddr_un);
+
+ (void) unlink(NDPD_SNMP_SOCKET);
+ ret = bind(sock, (struct sockaddr *)&laddr, len);
+ if (ret < 0) {
+ logperror("setup_mibsock: bind\n");
+ exit(1);
+ }
+
+ ret = fcntl(sock, F_SETFL, O_NONBLOCK);
+ if (ret < 0) {
+ logperror("fcntl(O_NONBLOCK)");
+ exit(1);
+ }
+ if (poll_add(sock) == -1) {
+ exit(1);
+ }
+ return (sock);
+}
+
/*
* Retrieve one routing socket message. If RTM_IFINFO indicates
* new phyint do a full scan of the interfaces. If RTM_IFINFO
@@ -1644,6 +1690,113 @@ process_rtsock(int rtsock)
}
}
+static void
+process_mibsock(int mibsock)
+{
+ struct phyint *pi;
+ socklen_t fromlen;
+ struct sockaddr_un from;
+ ndpd_info_t ndpd_info;
+ ssize_t len;
+ int command;
+
+ fromlen = (socklen_t)sizeof (from);
+ len = recvfrom(mibsock, &command, sizeof (int), 0,
+ (struct sockaddr *)&from, &fromlen);
+
+ if (len < sizeof (int) || command != NDPD_SNMP_INFO_REQ) {
+ logperror("process_mibsock: bad command \n");
+ return;
+ }
+
+ ndpd_info.info_type = NDPD_SNMP_INFO_RESPONSE;
+ ndpd_info.info_version = NDPD_SNMP_INFO_VER;
+ ndpd_info.info_num_of_phyints = num_of_phyints;
+
+ (void) sendto(mibsock, &ndpd_info, sizeof (ndpd_info_t), 0,
+ (struct sockaddr *)&from, fromlen);
+
+ for (pi = phyints; pi != NULL; pi = pi->pi_next) {
+ int prefixes;
+ int routers;
+ struct prefix *prefix_list;
+ struct router *router_list;
+ ndpd_phyint_info_t phyint;
+ ndpd_prefix_info_t prefix;
+ ndpd_router_info_t router;
+ /*
+ * get number of prefixes
+ */
+ routers = 0;
+ prefixes = 0;
+ prefix_list = pi->pi_prefix_list;
+ while (prefix_list != NULL) {
+ prefixes++;
+ prefix_list = prefix_list->pr_next;
+ }
+
+ /*
+ * get number of routers
+ */
+ router_list = pi->pi_router_list;
+ while (router_list != NULL) {
+ routers++;
+ router_list = router_list->dr_next;
+ }
+
+ phyint.phyint_info_type = NDPD_PHYINT_INFO;
+ phyint.phyint_info_version = NDPD_PHYINT_INFO_VER;
+ phyint.phyint_index = pi->pi_index;
+ bcopy(pi->pi_config,
+ phyint.phyint_config, I_IFSIZE);
+ phyint.phyint_num_of_prefixes = prefixes;
+ phyint.phyint_num_of_routers = routers;
+ (void) sendto(mibsock, &phyint, sizeof (phyint), 0,
+ (struct sockaddr *)&from, fromlen);
+
+ /*
+ * Copy prefix information
+ */
+
+ prefix_list = pi->pi_prefix_list;
+ while (prefix_list != NULL) {
+ prefix.prefix_info_type = NDPD_PREFIX_INFO;
+ prefix.prefix_info_version = NDPD_PREFIX_INFO_VER;
+ prefix.prefix_prefix = prefix_list->pr_prefix;
+ prefix.prefix_len = prefix_list->pr_prefix_len;
+ prefix.prefix_flags = prefix_list->pr_flags;
+ prefix.prefix_phyint_index = pi->pi_index;
+ prefix.prefix_ValidLifetime =
+ prefix_list->pr_ValidLifetime;
+ prefix.prefix_PreferredLifetime =
+ prefix_list->pr_PreferredLifetime;
+ prefix.prefix_OnLinkLifetime =
+ prefix_list->pr_OnLinkLifetime;
+ prefix.prefix_OnLinkFlag =
+ prefix_list->pr_OnLinkFlag;
+ prefix.prefix_AutonomousFlag =
+ prefix_list->pr_AutonomousFlag;
+ (void) sendto(mibsock, &prefix, sizeof (prefix), 0,
+ (struct sockaddr *)&from, fromlen);
+ prefix_list = prefix_list->pr_next;
+ }
+ /*
+ * Copy router information
+ */
+ router_list = pi->pi_router_list;
+ while (router_list != NULL) {
+ router.router_info_type = NDPD_ROUTER_INFO;
+ router.router_info_version = NDPD_ROUTER_INFO_VER;
+ router.router_address = router_list->dr_address;
+ router.router_lifetime = router_list->dr_lifetime;
+ router.router_phyint_index = pi->pi_index;
+ (void) sendto(mibsock, &router, sizeof (router), 0,
+ (struct sockaddr *)&from, fromlen);
+ router_list = router_list->dr_next;
+ }
+ }
+}
+
/*
* Check whether the address formed by pr->pr_prefix and pi_token
* exists in the kernel. Cannot call SIOCTMYADDR/ONLINK as it
@@ -1940,6 +2093,7 @@ main(int argc, char *argv[])
setup_eventpipe();
rtsock = setup_rtsock();
+ mibsock = setup_mibsock();
timer_init();
initifs(_B_TRUE);
@@ -1963,6 +2117,10 @@ main(int argc, char *argv[])
process_rtsock(rtsock);
break;
}
+ if (pollfds[i].fd == mibsock) {
+ process_mibsock(mibsock);
+ break;
+ }
/*
* Run timer routine to advance clock if more than
* half a second since the clock was advanced.
diff --git a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.c b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.c
index b77bd8cafd..763988fc72 100644
--- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.c
+++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.c
@@ -29,8 +29,10 @@
#include "tables.h"
#include <time.h>
+#include <assert.h>
struct phyint *phyints = NULL;
+int num_of_phyints = 0;
static void phyint_print(struct phyint *pi);
static void phyint_insert(struct phyint *pi);
@@ -157,6 +159,7 @@ phyint_insert(struct phyint *pi)
if (phyints)
phyints->pi_prev = pi;
phyints = pi;
+ num_of_phyints++;
}
/*
@@ -498,6 +501,8 @@ phyint_delete(struct phyint *pi)
if (debug & D_PHYINT)
logmsg(LOG_DEBUG, "phyint_delete(%s)\n", pi->pi_name);
+ assert(num_of_phyints > 0);
+
while (pi->pi_router_list)
router_delete(pi->pi_router_list);
while (pi->pi_prefix_list)
@@ -525,6 +530,7 @@ phyint_delete(struct phyint *pi)
if (pi->pi_group_name != NULL)
free(pi->pi_group_name);
free(pi);
+ num_of_phyints--;
}
/*
diff --git a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h
index 6bdfee9f80..d03c428993 100644
--- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h
+++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/tables.h
@@ -32,6 +32,8 @@
extern "C" {
#endif
+#include <protocols/ndpd.h>
+
enum adv_states { NO_ADV = 0, REG_ADV, INIT_ADV, SOLICIT_ADV, FINAL_ADV };
enum adv_events { ADV_OFF, START_INIT_ADV, START_FINAL_ADV, RECEIVED_SOLICIT,
ADV_TIMER };
@@ -39,40 +41,6 @@ enum adv_events { ADV_OFF, START_INIT_ADV, START_FINAL_ADV, RECEIVED_SOLICIT,
enum solicit_states { NO_SOLICIT = 0, INIT_SOLICIT, DONE_SOLICIT };
enum solicit_events { SOLICIT_OFF, START_INIT_SOLICIT, SOL_TIMER,
SOLICIT_DONE };
-
-/*
- * Data structures used to handle configuration variables set in ndpd.conf.
- * cf_notdefault is set for variables explicitly set in ndpd.conf.
- */
-struct confvar {
- uint_t cf_value;
- boolean_t cf_notdefault;
-};
-
-extern struct confvar ifdefaults[];
-
-/*
- * Interfaces configuration variable indicies
- */
-#define I_DupAddrDetectTransmits 0 /* From RFC 2462 */
-#define I_AdvSendAdvertisements 1
-#define I_MaxRtrAdvInterval 2 /* In seconds */
-#define I_MinRtrAdvInterval 3 /* In seconds */
-#define I_AdvManagedFlag 4
-#define I_AdvOtherConfigFlag 5
-#define I_AdvLinkMTU 6
-#define I_AdvReachableTime 7 /* In milliseconds */
-#define I_AdvRetransTimer 8 /* In milliseconds */
-#define I_AdvCurHopLimit 9
-#define I_AdvDefaultLifetime 10 /* In seconds */
-#define I_StatelessAddrConf 11
-#define I_TmpAddrsEnabled 12 /* From RFC 3041 */
-#define I_TmpValidLifetime 13 /* In seconds */
-#define I_TmpPreferredLifetime 14 /* In seconds */
-#define I_TmpRegenAdvance 15 /* In seconds */
-#define I_TmpMaxDesyncFactor 16 /* In seconds */
-#define I_IFSIZE 17 /* # of variables */
-
/*
* A doubly linked list of all physical interfaces that each contain a
* doubly linked list of prefixes (i.e. logical interfaces) and default
@@ -270,6 +238,7 @@ struct router {
* Globals
*/
extern struct phyint *phyints;
+extern int num_of_phyints;
/*
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/defs.h b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/defs.h
index 7f03374959..5b3ba902cd 100644
--- a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/defs.h
+++ b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/defs.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* Copyright (c) 1983, 1988, 1993
@@ -165,6 +165,8 @@ union pkt_buf {
struct rip rip;
};
+extern struct dr *drs;
+
/*
* IF_NAME_LEN is the maximum size of interface names represented within
* in.routed. Regular Solaris interfaces have names of at most LIFNAMESIZ
@@ -585,6 +587,7 @@ extern int rip_sock; /* RIP socket */
extern struct interface *rip_sock_interface; /* current output interface */
extern int rt_sock; /* routing socket */
extern int rdisc_sock; /* router-discovery raw socket */
+extern int rdisc_mib_sock; /* AF_UNIX mib info socket */
extern boolean_t rip_enabled; /* is rip on? */
extern boolean_t supplier; /* process should supply updates */
@@ -717,6 +720,7 @@ extern void input_route(in_addr_t, in_addr_t, struct rt_spare *,
struct netinfo *, uint16_t);
extern void read_rt(void);
extern void read_d(void);
+extern void process_d_mib_sock(void);
extern void rdisc_adv(boolean_t);
extern void rdisc_sol(void);
extern struct interface *receiving_interface(struct msghdr *, boolean_t);
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/rdisc.c b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/rdisc.c
index 14d8862a36..6e572ccc41 100644
--- a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/rdisc.c
+++ b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/rdisc.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* Copyright (c) 1995
@@ -42,6 +42,8 @@
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
+#include <fcntl.h>
+#include <strings.h>
/*
* The size of the control buffer passed to recvmsg() used to receive
@@ -79,6 +81,7 @@ union ad_u {
int rdisc_sock = -1; /* router-discovery raw socket */
+int rdisc_mib_sock = -1; /* AF_UNIX mib info socket */
static struct interface *rdisc_sock_interface; /* current rdisc interface */
struct timeval rdisc_timer;
@@ -87,7 +90,8 @@ boolean_t rdisc_ok; /* using solicited route */
#define MAX_ADS 16
int max_ads; /* at least one per interface */
/* accumulated advertisements */
-static struct dr *cur_drp, *drs;
+static struct dr *cur_drp;
+struct dr *drs;
/*
* adjust unsigned preference by interface metric,
@@ -152,6 +156,8 @@ get_rdisc_sock(void)
{
int on = 1;
unsigned char ttl = 1;
+ struct sockaddr_un laddr;
+ int len;
if (rdisc_sock < 0) {
max_ads = MAX_ADS;
@@ -171,6 +177,33 @@ get_rdisc_sock(void)
DBGERR(_B_TRUE,
"rdisc_sock setsockopt(IP_MULTICAST_TTL)");
+ /*
+ * On Solaris also open an AF_UNIX socket to
+ * pass default router information to mib agent
+ */
+
+ rdisc_mib_sock = socket(AF_UNIX, SOCK_DGRAM, 0);
+ if (rdisc_mib_sock < 0) {
+ BADERR(_B_TRUE, "rdisc_mib_sock = socket()");
+ }
+
+ bzero(&laddr, sizeof (laddr));
+ laddr.sun_family = AF_UNIX;
+
+ (void) strncpy(laddr.sun_path, RDISC_SNMP_SOCKET,
+ sizeof (laddr.sun_path));
+ len = sizeof (struct sockaddr_un);
+
+ (void) unlink(RDISC_SNMP_SOCKET);
+
+ if (bind(rdisc_mib_sock, (struct sockaddr *)&laddr, len) < 0) {
+ BADERR(_B_TRUE, "bind(rdisc_mib_sock)");
+ }
+
+ if (fcntl(rdisc_mib_sock, F_SETFL, O_NONBLOCK) < 0) {
+ BADERR(_B_TRUE, "rdisc_mib_sock fcntl O_NONBLOCK");
+ }
+
fix_select();
}
}
@@ -1398,3 +1431,58 @@ rdisc_restore(struct interface *ifp)
trace_misc("restoring rdisc adv on %s", ifp->int_name);
rdisc_timer.tv_sec = 0;
}
+
+void
+process_d_mib_sock(void)
+{
+
+ socklen_t fromlen;
+ struct sockaddr_un from;
+ ssize_t len;
+ int command;
+ struct dr *drp;
+ rdisc_info_t rdisc_info;
+ defr_t def_router;
+ extern int max_ads;
+ int num = 0;
+
+ fromlen = (socklen_t)sizeof (from);
+ len = recvfrom(rdisc_mib_sock, &command, sizeof (int), 0,
+ (struct sockaddr *)&from, &fromlen);
+
+ if (len < sizeof (int) || command != RDISC_SNMP_INFO_REQ) {
+ trace_misc("Bad command on rdisc_mib_sock");
+ return;
+ }
+
+ /*
+ * Count number of good routers
+ */
+ for (drp = drs; drp < &drs[max_ads]; drp++) {
+ if (drp->dr_ts != 0) {
+ num++;
+ }
+ }
+
+ rdisc_info.info_type = RDISC_SNMP_INFO_RESPONSE;
+ rdisc_info.info_version = RDISC_SNMP_INFO_VER;
+ rdisc_info.info_num_of_routers = num;
+
+ (void) sendto(rdisc_mib_sock, &rdisc_info, sizeof (rdisc_info_t), 0,
+ (struct sockaddr *)&from, fromlen);
+
+ for (drp = drs; drp < &drs[max_ads]; drp++) {
+ if (drp->dr_ts != 0) {
+ def_router.defr_info_type = RDISC_DEF_ROUTER_INFO;
+ def_router.defr_version = RDISC_DEF_ROUTER_VER;
+ def_router.defr_index =
+ drp->dr_ifp->int_phys->phyi_index;
+ def_router.defr_life = drp->dr_life;
+ def_router.defr_addr.s_addr = drp->dr_gate;
+ def_router.defr_pref = drp->dr_pref;
+ (void) sendto(rdisc_mib_sock, &def_router,
+ sizeof (defr_t), 0, (struct sockaddr *)&from,
+ fromlen);
+ }
+ }
+}
diff --git a/usr/src/head/Makefile b/usr/src/head/Makefile
index 2d111dd9b3..f4cc4e82e0 100644
--- a/usr/src/head/Makefile
+++ b/usr/src/head/Makefile
@@ -307,7 +307,7 @@ $(LVMRPCHDRS:%.h=%.x)
RPCSVCHDRS= $(RPCSVC_SRC_HDRS) $(RPCSVC_GEN_HDRS)
-PROTOHDRS= dumprestore.h routed.h ripngd.h rwhod.h timed.h
+PROTOHDRS= dumprestore.h ndpd.h routed.h ripngd.h rwhod.h timed.h
ROOTHDRS= $(HDRS:%=$(ROOT)/usr/include/%) \
$(KRB5HDRS:%=$(ROOT)/usr/include/kerberosv5/%) \
diff --git a/usr/src/head/protocols/ndpd.h b/usr/src/head/protocols/ndpd.h
new file mode 100644
index 0000000000..f2e5d168f4
--- /dev/null
+++ b/usr/src/head/protocols/ndpd.h
@@ -0,0 +1,148 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _NDPD_H
+#define _NDPD_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define NDPD_SNMP_SOCKET "/var/run/in.ndpd_mib"
+#define NDPD_SNMP_INFO_REQ 1
+#define NDPD_SNMP_INFO_RESPONSE 2
+#define NDPD_PHYINT_INFO 3
+#define NDPD_PREFIX_INFO 4
+#define NDPD_ROUTER_INFO 5
+
+#define NDPD_SNMP_INFO_VER 1
+#define NDPD_PHYINT_INFO_VER 1
+#define NDPD_PREFIX_INFO_VER 1
+#define NDPD_ROUTER_INFO_VER 1
+
+/*
+ * Data structures used to handle configuration variables set in ndpd.conf.
+ * cf_notdefault is set for variables explicitly set in ndpd.conf.
+ */
+struct confvar {
+ uint_t cf_value;
+ boolean_t cf_notdefault;
+};
+
+extern struct confvar ifdefaults[];
+
+/*
+ * Interfaces configuration variable indicies
+ */
+#define I_DupAddrDetectTransmits 0 /* From RFC 2462 */
+#define I_AdvSendAdvertisements 1
+#define I_MaxRtrAdvInterval 2 /* In seconds */
+#define I_MinRtrAdvInterval 3 /* In seconds */
+#define I_AdvManagedFlag 4
+#define I_AdvOtherConfigFlag 5
+#define I_AdvLinkMTU 6
+#define I_AdvReachableTime 7 /* In milliseconds */
+#define I_AdvRetransTimer 8 /* In milliseconds */
+#define I_AdvCurHopLimit 9
+#define I_AdvDefaultLifetime 10 /* In seconds */
+#define I_StatelessAddrConf 11
+#define I_TmpAddrsEnabled 12 /* From RFC 3041 */
+#define I_TmpValidLifetime 13 /* In seconds */
+#define I_TmpPreferredLifetime 14 /* In seconds */
+#define I_TmpRegenAdvance 15 /* In seconds */
+#define I_TmpMaxDesyncFactor 16 /* In seconds */
+#define I_IFSIZE 17 /* # of variables */
+
+typedef struct ndpd_info_s {
+ uint_t info_type;
+ uint_t info_version;
+ uint_t info_num_of_phyints;
+} ndpd_info_t;
+
+typedef struct ndpd_prefix_info_s {
+ uint_t prefix_info_type;
+ uint_t prefix_info_version;
+ struct in6_addr prefix_prefix; /* Used to indentify prefix */
+ uint_t prefix_len; /* Num bits valid */
+ uint_t prefix_flags; /* IFF_ flags */
+ uint_t prefix_phyint_index;
+ uint_t prefix_ValidLifetime; /* In ms w/ 2 hour rule */
+ uint_t prefix_PreferredLifetime; /* In millseconds */
+ uint_t prefix_OnLinkLifetime; /* ms valid w/o 2 hour rule */
+ boolean_t prefix_OnLinkFlag;
+ boolean_t prefix_AutonomousFlag;
+} ndpd_prefix_info_t;
+
+typedef struct ndpd_router_info_s {
+ uint_t router_info_type;
+ uint_t router_info_version;
+ struct in6_addr router_address; /* Used to identify router */
+ uint_t router_lifetime; /* In milliseconds */
+ uint_t router_phyint_index;
+} ndpd_router_info_t;
+
+
+typedef struct ndpd_phyint_info_s {
+ uint_t phyint_info_type;
+ uint_t phyint_info_version;
+ int phyint_index;
+ struct confvar phyint_config[I_IFSIZE];
+#define phyint_DupAddrDetectTransmits \
+ phyint_config[I_DupAddrDetectTransmits].cf_value
+#define phyint_AdvSendAdvertisements \
+ phyint_config[I_AdvSendAdvertisements].cf_value
+#define phyint_MaxRtrAdvInterval \
+ phyint_config[I_MaxRtrAdvInterval].cf_value
+#define phyint_MinRtrAdvInterval \
+ phyint_config[I_MinRtrAdvInterval].cf_value
+#define phyint_AdvManagedFlag phyint_config[I_AdvManagedFlag].cf_value
+#define phyint_AdvOtherConfigFlag \
+ phyint_config[I_AdvOtherConfigFlag].cf_value
+#define phyint_AdvLinkMTU phyint_config[I_AdvLinkMTU].cf_value
+#define phyint_AdvReachableTime phyint_config[I_AdvReachableTime].cf_value
+#define phyint_AdvRetransTimer phyint_config[I_AdvRetransTimer].cf_value
+#define phyint_AdvCurHopLimit phyint_config[I_AdvCurHopLimit].cf_value
+#define phyint_AdvDefaultLifetime \
+ phyint_config[I_AdvDefaultLifetime].cf_value
+#define phyint_StatelessAddrConf \
+ phyint_config[I_StatelessAddrConf].cf_value
+#define phyint_TmpAddrsEnabled phyint_config[I_TmpAddrsEnabled].cf_value
+#define phyint_TmpValidLifetime phyint_config[I_TmpValidLifetime].cf_value
+#define phyint_TmpPreferredLifetime \
+ phyint_config[I_TmpPreferredLifetime].cf_value
+#define phyint_TmpRegenAdvance phyint_config[I_TmpRegenAdvance].cf_value
+#define phyint_TmpMaxDesyncFactor \
+ phyint_config[I_TmpMaxDesyncFactor].cf_value
+ uint_t phyint_num_of_prefixes;
+ uint_t phyint_num_of_routers;
+} ndpd_phyint_info_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NDPD_H */
diff --git a/usr/src/head/protocols/routed.h b/usr/src/head/protocols/routed.h
index db58d9a406..58d0781ccc 100644
--- a/usr/src/head/protocols/routed.h
+++ b/usr/src/head/protocols/routed.h
@@ -150,6 +150,25 @@ struct entryinfo {
char int_name[16];
};
+typedef struct rdisc_info_s {
+ uint_t info_type;
+ uint_t info_version;
+ uint_t info_num_of_routers;
+} rdisc_info_t;
+
+/*
+ * Structure that is returned with the default router info.
+ */
+typedef struct defr_s {
+ uint32_t defr_info_type;
+ uint32_t defr_version;
+ struct in_addr defr_addr;
+ uint32_t defr_index;
+ uint32_t defr_life;
+ uint32_t defr_pref;
+} defr_t;
+
+
/*
* Packet types.
*/
@@ -171,6 +190,15 @@ struct entryinfo {
#define RIPCMD_MAX 7
+#define RDISC_SNMP_SOCKET "/var/run/in.rdisc_mib"
+
+#define RDISC_SNMP_INFO_REQ 1
+#define RDISC_SNMP_INFO_RESPONSE 2
+#define RDISC_DEF_ROUTER_INFO 3
+
+#define RDISC_SNMP_INFO_VER 1
+#define RDISC_DEF_ROUTER_VER 1
+
#define HOPCNT_INFINITY 16 /* per Xerox NS */
#define MAXPACKETSIZE 512 /* max broadcast size */
#define NETS_LEN ((MAXPACKETSIZE - sizeof (struct rip)) \
diff --git a/usr/src/pkgdefs/SUNWhea/prototype_com b/usr/src/pkgdefs/SUNWhea/prototype_com
index e44825d0f3..70adb97f8b 100644
--- a/usr/src/pkgdefs/SUNWhea/prototype_com
+++ b/usr/src/pkgdefs/SUNWhea/prototype_com
@@ -332,6 +332,7 @@ f none usr/include/prof_attr.h 644 root bin
f none usr/include/project.h 644 root bin
d none usr/include/protocols 755 root bin
f none usr/include/protocols/dumprestore.h 644 root bin
+f none usr/include/protocols/ndpd.h 644 root bin
f none usr/include/protocols/routed.h 644 root bin
f none usr/include/protocols/rwhod.h 644 root bin
f none usr/include/protocols/timed.h 644 root bin
diff --git a/usr/src/uts/common/inet/ip.h b/usr/src/uts/common/inet/ip.h
index 228a9d7ff6..2aea221c5c 100644
--- a/usr/src/uts/common/inet/ip.h
+++ b/usr/src/uts/common/inet/ip.h
@@ -1561,7 +1561,7 @@ typedef struct ipfb_s {
* hash bucket without stumbling up on a free pointer.
*
* irb_t structures in ip_ftable are dynamically allocated and freed.
- * In order to identify the irb_t structures that cna be safely kmem_free'd
+ * In order to identify the irb_t structures that can be safely kmem_free'd
* we need to ensure that
* - the irb_refcnt is quiescent, indicating no other walkers,
* - no other threads or ire's are holding references to the irb,
@@ -1886,7 +1886,7 @@ typedef struct ill_s {
in6_addr_t ill_token;
uint_t ill_token_length;
uint32_t ill_xmit_count; /* ndp max multicast xmits */
- mib2_ipv6IfStatsEntry_t *ill_ip6_mib; /* Per interface mib */
+ mib2_ipIfStatsEntry_t *ill_ip_mib; /* ver indep. interface mib */
mib2_ipv6IfIcmpEntry_t *ill_icmp6_mib; /* Per interface mib */
/*
* Following two mblks are allocated common to all
@@ -2924,7 +2924,7 @@ extern nv_t *ire_nv_tbl;
extern time_t ip_g_frag_timeout;
extern clock_t ip_g_frag_timo_ms;
-extern mib2_ip_t ip_mib; /* For tcpInErrs and udpNoPorts */
+extern mib2_ipIfStatsEntry_t ip_mib; /* For tcpInErrs and udpNoPorts */
extern struct module_info ip_mod_info;
@@ -3169,6 +3169,10 @@ extern void ip_rput_forward_multicast(ipaddr_t, mblk_t *, ipif_t *);
extern int ip_snmpmod_close(queue_t *);
extern void ip_snmpmod_wput(queue_t *, mblk_t *);
+extern void ip_mib2_add_ip_stats(mib2_ipIfStatsEntry_t *,
+ mib2_ipIfStatsEntry_t *);
+extern void ip_mib2_add_icmp6_stats(mib2_ipv6IfIcmpEntry_t *,
+ mib2_ipv6IfIcmpEntry_t *);
extern void ip_udp_input(queue_t *, mblk_t *, ipha_t *, ire_t *, ill_t *);
extern void ip_proto_input(queue_t *, mblk_t *, ipha_t *, ire_t *, ill_t *);
extern void ip_rput_other(ipsq_t *, queue_t *, mblk_t *, void *);
diff --git a/usr/src/uts/common/inet/ip/ip.c b/usr/src/uts/common/inet/ip/ip.c
index 94efa0083f..d73a8db525 100644
--- a/usr/src/uts/common/inet/ip/ip.c
+++ b/usr/src/uts/common/inet/ip/ip.c
@@ -761,11 +761,15 @@ void ip_rput_forward(ire_t *, ipha_t *, mblk_t *, ill_t *);
static int ip_rput_forward_options(mblk_t *, ipha_t *, ire_t *);
static boolean_t ip_rput_local_options(queue_t *, mblk_t *, ipha_t *,
ire_t *);
+static boolean_t ip_rput_multimblk_ipoptions(queue_t *, ill_t *,
+ mblk_t *, ipha_t **, ipaddr_t *);
static int ip_rput_options(queue_t *, mblk_t *, ipha_t *, ipaddr_t *);
static boolean_t ip_rput_fragment(queue_t *, mblk_t **, ipha_t *, uint32_t *,
uint16_t *);
int ip_snmp_get(queue_t *, mblk_t *);
-static mblk_t *ip_snmp_get_mib2_ip(queue_t *, mblk_t *);
+static mblk_t *ip_snmp_get_mib2_ip(queue_t *, mblk_t *,
+ mib2_ipIfStatsEntry_t *);
+static mblk_t *ip_snmp_get_mib2_ip_traffic_stats(queue_t *, mblk_t *);
static mblk_t *ip_snmp_get_mib2_ip6(queue_t *, mblk_t *);
static mblk_t *ip_snmp_get_mib2_icmp(queue_t *, mblk_t *);
static mblk_t *ip_snmp_get_mib2_icmp6(queue_t *, mblk_t *);
@@ -883,8 +887,8 @@ vmem_t *ip_minor_arena;
/*
* MIB-2 stuff for SNMP (both IP and ICMP)
*/
-mib2_ip_t ip_mib;
-mib2_icmp_t icmp_mib;
+mib2_ipIfStatsEntry_t ip_mib;
+mib2_icmp_t icmp_mib;
#ifdef DEBUG
uint32_t ipsechw_debug = 0;
@@ -1843,7 +1847,8 @@ icmp_inbound(queue_t *q, mblk_t *mp, boolean_t broadcast, ill_t *ill,
if (wptr + tstamp_len > mp->b_wptr) {
if (!pullupmsg(mp, wptr + tstamp_len -
mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -1974,7 +1979,7 @@ icmp_inbound(queue_t *q, mblk_t *mp, boolean_t broadcast, ill_t *ill,
ipha = (ipha_t *)&icmph[1];
if ((uchar_t *)&ipha[1] > mp->b_wptr) {
if (!pullupmsg(mp, (uchar_t *)&ipha[1] - mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -1982,20 +1987,20 @@ icmp_inbound(queue_t *q, mblk_t *mp, boolean_t broadcast, ill_t *ill,
ipha = (ipha_t *)&icmph[1];
}
if ((IPH_HDR_VERSION(ipha) != IPV4_VERSION)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
hdr_length = IPH_HDR_LENGTH(ipha);
if (hdr_length < sizeof (ipha_t)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
if ((uchar_t *)ipha + hdr_length > mp->b_wptr) {
if (!pullupmsg(mp,
(uchar_t *)ipha + hdr_length - mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -2131,7 +2136,7 @@ icmp_inbound(queue_t *q, mblk_t *mp, boolean_t broadcast, ill_t *ill,
if (src_ire == NULL) {
ipif = ipif_get_next_ipif(NULL, ill);
if (ipif == NULL) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -2156,7 +2161,7 @@ icmp_inbound(queue_t *q, mblk_t *mp, boolean_t broadcast, ill_t *ill,
*/
ASSERT(first_mp == mp);
if ((first_mp = ipsec_in_alloc(B_TRUE)) == NULL) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -2183,7 +2188,7 @@ icmp_inbound(queue_t *q, mblk_t *mp, boolean_t broadcast, ill_t *ill,
ii->ipsec_in_zoneid = zoneid;
ASSERT(zoneid != ALL_ZONES);
if (!ipsec_in_to_out(first_mp, ipha, NULL)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return;
}
BUMP_MIB(&icmp_mib, icmpOutMsgs);
@@ -2312,6 +2317,7 @@ icmp_inbound_too_big(icmph_t *icmph, ipha_t *ipha, ill_t *ill,
ASSERT(icmph->icmph_type == ICMP_DEST_UNREACHABLE &&
icmph->icmph_code == ICMP_FRAGMENTATION_NEEDED);
+ ASSERT(ill != NULL);
hdr_length = IPH_HDR_LENGTH(ipha);
@@ -2327,7 +2333,7 @@ icmp_inbound_too_big(icmph_t *icmph, ipha_t *ipha, ill_t *ill,
mp->b_wptr) {
if (!pullupmsg(mp, (uchar_t *)ipha + hdr_length +
ICMP_MIN_TP_HDR_LEN - mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
ip1dbg(("icmp_inbound_too_big: insufficient hdr\n"));
return (B_FALSE);
}
@@ -2448,10 +2454,8 @@ icmp_inbound_self_encap_error(mblk_t *mp, int iph_hdr_length, int hdr_length)
* outer IP header.
*/
- if (!pullupmsg(mp, -1)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ if (!pullupmsg(mp, -1))
return (NULL);
- }
icmph = (icmph_t *)&mp->b_rptr[iph_hdr_length];
ipha = (ipha_t *)&icmph[1];
@@ -2550,6 +2554,8 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
tcph_t *tcph;
conn_t *connp;
+ ASSERT(ill != NULL);
+
first_mp = mp;
if (mctl_present) {
mp = first_mp->b_cont;
@@ -2571,8 +2577,7 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
mp->b_wptr) {
if (!pullupmsg(mp, (uchar_t *)ipha + hdr_length +
ICMP_MIN_TP_HDR_LEN - mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
icmph = (icmph_t *)&mp->b_rptr[iph_hdr_length];
ipha = (ipha_t *)&icmph[1];
@@ -2612,8 +2617,7 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
mp->b_wptr) {
if (!pullupmsg(mp, (uchar_t *)ipha + hdr_length +
ICMP_MIN_TP_HDR_LEN - mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
icmph = (icmph_t *)&mp->b_rptr[iph_hdr_length];
ipha = (ipha_t *)&icmph[1];
@@ -2625,10 +2629,8 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
*/
tcph = (tcph_t *)((uchar_t *)ipha + hdr_length);
connp = ipcl_tcp_lookup_reversed_ipv4(ipha, tcph, TCPS_LISTEN);
- if (connp == NULL) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
- }
+ if (connp == NULL)
+ goto discard_pkt;
/* Have to change db_type after any pullupmsg */
DB_TYPE(mp) = M_CTL;
@@ -2645,8 +2647,7 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
mp->b_wptr) {
if (!pullupmsg(mp, (uchar_t *)ipha + hdr_length +
ICMP_MIN_TP_HDR_LEN - mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
icmph = (icmph_t *)&mp->b_rptr[iph_hdr_length];
ipha = (ipha_t *)&icmph[1];
@@ -2720,7 +2721,7 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
first_mp = ipsec_in_alloc(B_TRUE);
if (first_mp == NULL) {
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return;
}
ii = (ipsec_in_t *)first_mp->b_rptr;
@@ -2772,9 +2773,7 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
if (!pullupmsg(mp, (uchar_t *)ipha +
hdr_length + sizeof (ipha_t) -
mp->b_rptr)) {
-
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
icmph = (icmph_t *)&mp->b_rptr[iph_hdr_length];
ipha = (ipha_t *)&icmph[1];
@@ -2790,12 +2789,10 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
*/
in_ipha = (ipha_t *)((uchar_t *)ipha + hdr_length);
if ((IPH_HDR_VERSION(in_ipha) != IPV4_VERSION)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
if (IPH_HDR_LENGTH(in_ipha) < sizeof (ipha_t)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
/* Check for Self-encapsulated tunnels */
if (in_ipha->ipha_src == ipha->ipha_src &&
@@ -2804,7 +2801,7 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
mp = icmp_inbound_self_encap_error(mp,
iph_hdr_length, hdr_length);
if (mp == NULL)
- goto drop_pkt;
+ goto discard_pkt;
icmph = (icmph_t *)&mp->b_rptr[iph_hdr_length];
ipha = (ipha_t *)&icmph[1];
hdr_length = IPH_HDR_LENGTH(ipha);
@@ -2814,8 +2811,7 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
* which we could not have possibly generated.
*/
if (ipha->ipha_protocol == IPPROTO_ENCAP) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
icmp_inbound_error_fanout(q, ill, first_mp,
icmph, ipha, iph_hdr_length, hdr_length,
@@ -2855,6 +2851,8 @@ icmp_inbound_error_fanout(queue_t *q, ill_t *ill, mblk_t *mp,
return;
}
/* NOTREACHED */
+discard_pkt:
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
drop_pkt:;
ip1dbg(("icmp_inbound_error_fanout: drop pkt\n"));
freemsg(first_mp);
@@ -3396,7 +3394,7 @@ icmp_pkt(queue_t *q, mblk_t *mp, void *stuff, size_t len,
* Convert the IPSEC_IN to IPSEC_OUT.
*/
if (!ipsec_in_to_out(ipsec_mp, ipha, NULL)) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
return;
}
io = (ipsec_out_t *)ipsec_mp->b_rptr;
@@ -3426,7 +3424,7 @@ icmp_pkt(queue_t *q, mblk_t *mp, void *stuff, size_t len,
ASSERT(DB_TYPE(mp) == M_DATA);
if ((ipsec_mp = ipsec_in_alloc(B_TRUE)) == NULL) {
freemsg(mp);
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
return;
}
ii = (ipsec_in_t *)ipsec_mp->b_rptr;
@@ -3447,7 +3445,7 @@ icmp_pkt(queue_t *q, mblk_t *mp, void *stuff, size_t len,
* Convert the IPSEC_IN to IPSEC_OUT.
*/
if (!ipsec_in_to_out(ipsec_mp, ipha, NULL)) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
return;
}
io = (ipsec_out_t *)ipsec_mp->b_rptr;
@@ -3467,7 +3465,7 @@ icmp_pkt(queue_t *q, mblk_t *mp, void *stuff, size_t len,
ire = ire_route_lookup(dst, 0, 0, 0, NULL, NULL, zoneid, NULL,
(MATCH_IRE_DEFAULT|MATCH_IRE_RECURSIVE|MATCH_IRE_ZONEONLY));
if (ire == NULL) {
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
freemsg(ipsec_mp);
return;
}
@@ -3483,7 +3481,7 @@ icmp_pkt(queue_t *q, mblk_t *mp, void *stuff, size_t len,
*/
if (io == NULL) {
/* This is not a IPSEC_OUT type control msg */
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
freemsg(ipsec_mp);
return;
}
@@ -3494,7 +3492,7 @@ icmp_pkt(queue_t *q, mblk_t *mp, void *stuff, size_t len,
ill_refrele(ill);
}
if (ipif == NULL) {
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
freemsg(ipsec_mp);
return;
}
@@ -3642,7 +3640,7 @@ icmp_pkt_err_ok(mblk_t *mp)
return (NULL);
ipha = (ipha_t *)mp->b_rptr;
if (ip_csum_hdr(ipha)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(&ip_mib, ipIfStatsInCksumErrs);
freemsg(mp);
return (NULL);
}
@@ -6135,26 +6133,28 @@ ip_proto_not_sup(queue_t *q, mblk_t *ipsec_mp, uint_t flags, zoneid_t zoneid)
mp = ipsec_mp->b_cont;
ipsec_mp->b_cont = NULL;
ipha = (ipha_t *)mp->b_rptr;
- if (IPH_HDR_VERSION(ipha) == IP_VERSION) {
- if (ip_fanout_send_icmp(q, mp, flags, ICMP_DEST_UNREACHABLE,
- ICMP_PROTOCOL_UNREACHABLE, B_FALSE, zoneid)) {
- BUMP_MIB(&ip_mib, ipInUnknownProtos);
- }
- } else {
- /* Get ill from index in ipsec_in_t. */
- ill = ill_lookup_on_ifindex(ii->ipsec_in_ill_index,
- B_TRUE, NULL, NULL, NULL, NULL);
- if (ill != NULL) {
+ /* Get ill from index in ipsec_in_t. */
+ ill = ill_lookup_on_ifindex(ii->ipsec_in_ill_index,
+ (IPH_HDR_VERSION(ipha) == IPV6_VERSION), NULL, NULL, NULL, NULL);
+ if (ill != NULL) {
+ if (IPH_HDR_VERSION(ipha) == IP_VERSION) {
+ if (ip_fanout_send_icmp(q, mp, flags,
+ ICMP_DEST_UNREACHABLE,
+ ICMP_PROTOCOL_UNREACHABLE, B_FALSE, zoneid)) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInUnknownProtos);
+ }
+ } else {
if (ip_fanout_send_icmp_v6(q, mp, flags,
ICMP6_PARAM_PROB, ICMP6_PARAMPROB_NEXTHEADER,
0, B_FALSE, zoneid)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InUnknownProtos);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInUnknownProtos);
}
-
- ill_refrele(ill);
- } else { /* re-link for the freemsg() below. */
- ipsec_mp->b_cont = mp;
}
+ ill_refrele(ill);
+ } else { /* re-link for the freemsg() below. */
+ ipsec_mp->b_cont = mp;
}
/* If ICMP delivered, ipsec_mp will be a singleton (b_cont == NULL). */
@@ -6236,7 +6236,9 @@ ip_fanout_proto(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha, uint_t flags,
conn_t *connp, *first_connp, *next_connp;
connf_t *connfp;
boolean_t shared_addr;
+ mib2_ipIfStatsEntry_t *mibptr;
+ mibptr = (ill != NULL) ? ill->ill_ip_mib : &ip_mib;
if (mctl_present) {
mp = first_mp->b_cont;
secure = ipsec_in_is_secure(first_mp);
@@ -6308,7 +6310,7 @@ ip_fanout_proto(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha, uint_t flags,
if (ip_fanout_send_icmp(q, first_mp, flags,
ICMP_DEST_UNREACHABLE, ICMP_PROTOCOL_UNREACHABLE,
mctl_present, zoneid)) {
- BUMP_MIB(&ip_mib, ipInUnknownProtos);
+ BUMP_MIB(mibptr, ipIfStatsInUnknownProtos);
}
}
return;
@@ -6352,7 +6354,7 @@ ip_fanout_proto(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha, uint_t flags,
rq = connp->conn_rq;
if (!canputnext(rq)) {
if (flags & IP_FF_RAWIP) {
- BUMP_MIB(&ip_mib, rawipInOverflows);
+ BUMP_MIB(mibptr, rawipIfStatsInOverflows);
} else {
BUMP_MIB(&icmp_mib, icmpInOverflows);
}
@@ -6392,7 +6394,7 @@ ip_fanout_proto(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha, uint_t flags,
mp1 = ip_add_info(mp1, recv_ill,
IPF_RECVIF);
}
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(mibptr, ipIfStatsHCInDelivers);
if (mctl_present)
freeb(first_mp1);
putnext(rq, mp1);
@@ -6427,7 +6429,7 @@ ip_fanout_proto(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha, uint_t flags,
rq = connp->conn_rq;
if (!canputnext(rq)) {
if (flags & IP_FF_RAWIP) {
- BUMP_MIB(&ip_mib, rawipInOverflows);
+ BUMP_MIB(mibptr, rawipIfStatsInOverflows);
} else {
BUMP_MIB(&icmp_mib, icmpInOverflows);
}
@@ -6474,7 +6476,7 @@ ip_fanout_proto(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha, uint_t flags,
ASSERT(recv_ill != NULL);
mp = ip_add_info(mp, recv_ill, IPF_RECVIF);
}
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(mibptr, ipIfStatsHCInDelivers);
putnext(rq, mp);
if (mctl_present)
freeb(first_mp);
@@ -6505,6 +6507,8 @@ ip_fanout_tcp(queue_t *q, mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
boolean_t syn_present = B_FALSE;
conn_t *connp;
+ ASSERT(recv_ill != NULL);
+
first_mp = mp;
if (mctl_present) {
ASSERT(first_mp->b_datap->db_type == M_CTL);
@@ -6532,7 +6536,7 @@ ip_fanout_tcp(queue_t *q, mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
if (first_mp == NULL)
return;
}
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsHCInDelivers);
ip2dbg(("ip_fanout_tcp: no listener; send reset to zone %d\n",
zoneid));
tcp_xmit_listeners_reset(first_mp, ip_hdr_len, zoneid);
@@ -6573,6 +6577,7 @@ ip_fanout_tcp(queue_t *q, mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
if (IPCL_IS_TCP(connp) && IPCL_IS_BOUND(connp) && !syn_present) {
uint_t flags = (unsigned int)tcph->th_flags[0] & 0xFF;
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsHCInDelivers);
if ((flags & TH_RST) || (flags & TH_URG)) {
CONN_DEC_REF(connp);
freemsg(first_mp);
@@ -6593,6 +6598,7 @@ ip_fanout_tcp(queue_t *q, mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
first_mp = ipsec_check_inbound_policy(first_mp, connp, ipha,
NULL, mctl_present);
if (first_mp == NULL) {
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
return;
}
@@ -6652,6 +6658,7 @@ ip_fanout_tcp(queue_t *q, mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
ASSERT(recv_ill != NULL);
mp = ip_add_info(mp, recv_ill, IPF_RECVIF);
if (mp == NULL) {
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
if (mctl_present)
freeb(first_mp);
@@ -6667,7 +6674,7 @@ ip_fanout_tcp(queue_t *q, mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
}
}
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsHCInDelivers);
if (IPCL_IS_TCP(connp)) {
(*ip_input_proc)(connp->conn_sqp, first_mp,
connp->conn_recv, connp, SQTAG_IP_FANOUT_TCP);
@@ -6691,20 +6698,22 @@ ip_fanout_tcp(queue_t *q, mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
*/
static void
ip_fanout_udp_conn(conn_t *connp, mblk_t *first_mp, mblk_t *mp,
- boolean_t secure, ipha_t *ipha, uint_t flags, ill_t *recv_ill,
+ boolean_t secure, ill_t *ill, ipha_t *ipha, uint_t flags, ill_t *recv_ill,
boolean_t ip_policy)
{
boolean_t mctl_present = (first_mp != NULL);
uint32_t in_flags = 0; /* set to IP_RECVSLLA and/or IP_RECVIF */
uint32_t ill_index;
+ ASSERT(ill != NULL);
+
if (mctl_present)
first_mp->b_cont = mp;
else
first_mp = mp;
if (CONN_UDP_FLOWCTLD(connp)) {
- BUMP_MIB(&ip_mib, udpInOverflows);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsInOverflows);
freemsg(first_mp);
return;
}
@@ -6712,8 +6721,10 @@ ip_fanout_udp_conn(conn_t *connp, mblk_t *first_mp, mblk_t *mp,
if (CONN_INBOUND_POLICY_PRESENT(connp) || secure) {
first_mp = ipsec_check_inbound_policy(first_mp, connp, ipha,
NULL, mctl_present);
- if (first_mp == NULL)
+ if (first_mp == NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return; /* Freed by ipsec_check_inbound_policy(). */
+ }
}
if (mctl_present)
freeb(first_mp);
@@ -6748,8 +6759,7 @@ ip_fanout_udp_conn(conn_t *connp, mblk_t *first_mp, mblk_t *mp,
ASSERT(recv_ill != NULL);
mp = ip_add_info(mp, recv_ill, in_flags);
}
- BUMP_MIB(&ip_mib, ipInDelivers);
-
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
/* Send it upstream */
CONN_UDP_RECV(connp, mp);
}
@@ -6839,8 +6849,8 @@ ip_fanout_udp(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha,
CONN_INC_REF(connp);
mutex_exit(&connfp->connf_lock);
- ip_fanout_udp_conn(connp, first_mp, mp, secure, ipha, flags,
- recv_ill, ip_policy);
+ ip_fanout_udp_conn(connp, first_mp, mp, secure, ill, ipha,
+ flags, recv_ill, ip_policy);
IP_STAT(ip_udp_fannorm);
CONN_DEC_REF(connp);
return;
@@ -6933,7 +6943,7 @@ ip_fanout_udp(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha,
* processing per-conn, then we would need to do it
* here too.
*/
- ip_fanout_udp_conn(connp, first_mp1, mp1, secure,
+ ip_fanout_udp_conn(connp, first_mp1, mp1, secure, ill,
ipha, flags, recv_ill, B_FALSE);
mutex_enter(&connfp->connf_lock);
/* Follow the next pointer before releasing the conn. */
@@ -6945,8 +6955,8 @@ ip_fanout_udp(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha,
/* Last one. Send it upstream. */
mutex_exit(&connfp->connf_lock);
- ip_fanout_udp_conn(connp, first_mp, mp, secure, ipha, flags, recv_ill,
- ip_policy);
+ ip_fanout_udp_conn(connp, first_mp, mp, secure, ill, ipha, flags,
+ recv_ill, ip_policy);
IP_STAT(ip_udp_fanmb);
CONN_DEC_REF(connp);
return;
@@ -7004,7 +7014,8 @@ notfound:
ICMP_DEST_UNREACHABLE,
ICMP_PORT_UNREACHABLE,
mctl_present, zoneid)) {
- BUMP_MIB(&ip_mib, udpNoPorts);
+ BUMP_MIB(ill->ill_ip_mib,
+ udpIfStatsNoPorts);
}
}
return;
@@ -7012,8 +7023,8 @@ notfound:
CONN_INC_REF(connp);
mutex_exit(&connfp->connf_lock);
- ip_fanout_udp_conn(connp, first_mp, mp, secure, ipha, flags,
- recv_ill, ip_policy);
+ ip_fanout_udp_conn(connp, first_mp, mp, secure, ill, ipha,
+ flags, recv_ill, ip_policy);
CONN_DEC_REF(connp);
return;
}
@@ -7060,7 +7071,7 @@ notfound:
* and we don't send icmp errors in response to
* multicast, just drop the packet and give up sooner.
*/
- BUMP_MIB(&ip_mib, udpNoPorts);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsNoPorts);
freemsg(first_mp);
}
return;
@@ -7116,7 +7127,7 @@ notfound:
* processing per-conn, then we would need to do it
* here too.
*/
- ip_fanout_udp_conn(connp, first_mp1, mp1, secure,
+ ip_fanout_udp_conn(connp, first_mp1, mp1, secure, ill,
ipha, flags, recv_ill, B_FALSE);
mutex_enter(&connfp->connf_lock);
/* Follow the next pointer before releasing the conn. */
@@ -7127,8 +7138,8 @@ notfound:
/* Last one. Send it upstream. */
mutex_exit(&connfp->connf_lock);
- ip_fanout_udp_conn(connp, first_mp, mp, secure, ipha, flags, recv_ill,
- ip_policy);
+ ip_fanout_udp_conn(connp, first_mp, mp, secure, ill, ipha, flags,
+ recv_ill, ip_policy);
CONN_DEC_REF(connp);
}
@@ -7320,7 +7331,7 @@ ip_mrtun_forward(ire_t *ire, ill_t *in_ill, mblk_t *mp)
if (((in_ill->ill_flags & ((ill_t *)ire->ire_stq->q_ptr)->ill_flags &
ILLF_ROUTER) == 0) ||
(in_ill == (ill_t *)ire->ire_stq->q_ptr)) {
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(in_ill->ill_ip_mib, ipIfStatsForwProhibits);
ip0dbg(("ip_mrtun_forward: Can't forward :"
"forwarding is not turned on\n"));
goto drop_pkt;
@@ -7330,8 +7341,7 @@ ip_mrtun_forward(ire_t *ire, ill_t *in_ill, mblk_t *mp)
* Don't forward if the interface is down
*/
if (ire->ire_ipif->ipif_ill->ill_ipif_up_count == 0) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- goto drop_pkt;
+ goto discard_pkt;
}
ipha = (ipha_t *)mp->b_rptr;
@@ -7341,14 +7351,15 @@ ip_mrtun_forward(ire_t *ire, ill_t *in_ill, mblk_t *mp)
ipha->ipha_hdr_checksum = (uint16_t)(sum + (sum >> 16));
if (ipha->ipha_ttl-- <= 1) {
if (ip_csum_hdr(ipha)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(in_ill->ill_ip_mib, ipIfStatsInCksumErrs);
goto drop_pkt;
}
q = ire->ire_stq;
if ((first_mp = allocb(sizeof (ipsec_info_t),
BPRI_HI)) == NULL) {
- goto drop_pkt;
+ goto discard_pkt;
}
+ BUMP_MIB(in_ill->ill_ip_mib, ipIfStatsForwProhibits);
ip_ipsec_out_prepend(first_mp, mp, in_ill);
/* Sent by forwarding path, and router is global zone */
icmp_time_exceeded(q, first_mp, ICMP_TTL_EXCEEDED,
@@ -7394,7 +7405,7 @@ ip_mrtun_forward(ire_t *ire, ill_t *in_ill, mblk_t *mp)
* was good coming in.
*/
if (ip_csum_hdr(ipha)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(in_ill->ill_ip_mib, ipIfStatsInCksumErrs);
goto drop_pkt;
}
@@ -7410,7 +7421,7 @@ ip_mrtun_forward(ire_t *ire, ill_t *in_ill, mblk_t *mp)
}
if ((first_mp = allocb(sizeof (ipsec_info_t),
BPRI_HI)) == NULL) {
- goto drop_pkt;
+ goto discard_pkt;
}
ip_ipsec_out_prepend(first_mp, mp, in_ill);
mp = first_mp;
@@ -7442,7 +7453,8 @@ ip_mrtun_forward(ire_t *ire, ill_t *in_ill, mblk_t *mp)
}
return;
-
+discard_pkt:
+ BUMP_MIB(in_ill->ill_ip_mib, ipIfStatsInDiscards);
drop_pkt:;
ip2dbg(("ip_mrtun_forward: dropping pkt\n"));
freemsg(mp);
@@ -7563,14 +7575,18 @@ ip_grab_attach_ill(ill_t *ill, mblk_t *first_mp, int ifindex, boolean_t isv6)
(ret_ill->ill_phyint->phyint_flags & PHYI_OFFLINE)) {
if (isv6) {
if (ill != NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
} else {
- BUMP_MIB(&ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutDiscards);
}
ip1dbg(("ip_grab_attach_ill (IPv6): "
"bad ifindex %d.\n", ifindex));
} else {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ if (ill != NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
+ }
ip1dbg(("ip_grab_attach_ill (IPv4): "
"bad ifindex %d.\n", ifindex));
}
@@ -8787,9 +8803,17 @@ ip_newroute(queue_t *q, mblk_t *mp, ipaddr_t dst, ill_t *in_ill, conn_t *connp,
if (mp->b_prev) {
mp->b_next = NULL;
mp->b_prev = NULL;
- BUMP_MIB(&ip_mib, ipInDiscards);
+ if (in_ill != NULL) {
+ BUMP_MIB(in_ill->ill_ip_mib, ipIfStatsInDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsInDiscards);
+ }
} else {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ if (dst_ill != NULL) {
+ BUMP_MIB(dst_ill->ill_ip_mib, ipIfStatsOutDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
+ }
}
ASSERT(copy_mp == NULL);
MULTIRT_DEBUG_UNTAG(first_mp);
@@ -8816,10 +8840,19 @@ icmp_err_ret:
if (mp->b_prev) {
mp->b_next = NULL;
mp->b_prev = NULL;
- /* XXX ipInNoRoutes */
+ if (in_ill != NULL) {
+ BUMP_MIB(in_ill->ill_ip_mib, ipIfStatsInNoRoutes);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsInNoRoutes);
+ }
q = WR(q);
} else {
/*
+ * There is no outgoing ill, so just increment the
+ * system MIB.
+ */
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
+ /*
* Since ip_wput() isn't close to finished, we fill
* in enough of the header for credible error reporting.
*/
@@ -8832,7 +8865,6 @@ icmp_err_ret:
return;
}
}
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
/*
* At this point we will have ire only if RTF_BLACKHOLE
@@ -9801,13 +9833,13 @@ ip_setqinfo(queue_t *q, minor_t minor, boolean_t bump_mib)
if (minor == IPV6_MINOR) {
if (bump_mib)
- BUMP_MIB(&ip6_mib, ipv6OutSwitchIPv4);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutSwitchIPVersion);
q->q_qinfo = &rinit_ipv6;
WR(q)->q_qinfo = &winit_ipv6;
(Q_TO_CONN(q))->conn_pkt_isv6 = B_TRUE;
} else {
if (bump_mib)
- BUMP_MIB(&ip_mib, ipOutSwitchIPv6);
+ BUMP_MIB(&ip_mib, ipIfStatsOutSwitchIPVersion);
q->q_qinfo = &iprinit;
WR(q)->q_qinfo = &ipwinit;
(Q_TO_CONN(q))->conn_pkt_isv6 = B_FALSE;
@@ -11787,13 +11819,8 @@ ip_reassemble(mblk_t *mp, ipf_t *ipf, uint_t start, boolean_t more, ill_t *ill,
if (end < IP_REASS_END(mp1)) {
mp->b_wptr -= end - offset;
IP_REASS_SET_END(mp, offset);
- if (ill->ill_isv6) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6ReasmPartDups);
- } else {
- BUMP_MIB(&ip_mib,
- ipReasmPartDups);
- }
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsReasmPartDups);
break;
}
/* Did we cover another hole? */
@@ -11818,12 +11845,8 @@ ip_reassemble(mblk_t *mp, ipf_t *ipf, uint_t start, boolean_t more, ill_t *ill,
ipf->ipf_count -= mp1->b_datap->db_lim -
mp1->b_datap->db_base;
freeb(mp1);
- if (ill->ill_isv6) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6ReasmPartDups);
- } else {
- BUMP_MIB(&ip_mib, ipReasmPartDups);
- }
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsReasmPartDups);
mp1 = mp->b_cont;
if (!mp1)
break;
@@ -11851,13 +11874,8 @@ ip_reassemble(mblk_t *mp, ipf_t *ipf, uint_t start, boolean_t more, ill_t *ill,
incr_dups = B_FALSE;
}
freeb(mp);
- if (ill->ill_isv6) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6ReasmDuplicates);
- } else {
- BUMP_MIB(&ip_mib,
- ipReasmDuplicates);
- }
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsReasmDuplicates);
break;
}
/*
@@ -11866,12 +11884,8 @@ ip_reassemble(mblk_t *mp, ipf_t *ipf, uint_t start, boolean_t more, ill_t *ill,
*/
IP_REASS_SET_START(mp, offset);
mp->b_rptr += offset - start;
- if (ill->ill_isv6) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6ReasmPartDups);
- } else {
- BUMP_MIB(&ip_mib, ipReasmPartDups);
- }
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsReasmPartDups);
start = offset;
if (!mp1->b_cont) {
/*
@@ -11907,14 +11921,8 @@ ip_reassemble(mblk_t *mp, ipf_t *ipf, uint_t start, boolean_t more, ill_t *ill,
* this up twice if there is
* overlap at both ends.
*/
- if (ill->ill_isv6) {
- BUMP_MIB(
- ill->ill_ip6_mib,
- ipv6ReasmPartDups);
- } else {
- BUMP_MIB(&ip_mib,
- ipReasmPartDups);
- }
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsReasmPartDups);
break;
}
/* Did we cover another hole? */
@@ -11944,13 +11952,8 @@ ip_reassemble(mblk_t *mp, ipf_t *ipf, uint_t start, boolean_t more, ill_t *ill,
mp1->b_datap->db_lim -
mp1->b_datap->db_base;
freeb(mp1);
- if (ill->ill_isv6) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6ReasmPartDups);
- } else {
- BUMP_MIB(&ip_mib,
- ipReasmPartDups);
- }
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsReasmPartDups);
mp1 = mp->b_cont;
if (!mp1)
break;
@@ -12244,15 +12247,14 @@ ip_rput_fragment(queue_t *q, mblk_t **mpp, ipha_t *ipha,
/* New guy. Allocate a frag message. */
mp1 = allocb(sizeof (*ipf), BPRI_MED);
if (mp1 == NULL) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
reass_done:
mutex_exit(&ipfb->ipfb_lock);
return (B_FALSE);
}
-
- BUMP_MIB(&ip_mib, ipReasmReqds);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmReqds);
mp1->b_cont = mp;
/* Initialize the fragment header. */
@@ -12430,7 +12432,7 @@ reass_done:
* to report back to the transport.
*/
ecn_info = ipf->ipf_ecn;
- BUMP_MIB(&ip_mib, ipReasmOKs);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmOKs);
ipfp = ipf->ipf_ptphn;
/* We need to supply these to caller */
@@ -12459,7 +12461,7 @@ reass_done:
packet_size = (uint32_t)msgdsize(mp);
if (packet_size > IP_MAXPACKET) {
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
return (B_FALSE);
}
@@ -12468,7 +12470,7 @@ reass_done:
freemsg(mp);
if (mp2 == NULL) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return (B_FALSE);
}
mp = mp2;
@@ -12498,7 +12500,7 @@ reass_done:
* the mp. caller is responsible for decrementing ire ref cnt.
*/
static boolean_t
-ip_options_cksum(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire)
+ip_options_cksum(queue_t *q, ill_t *ill, mblk_t *mp, ipha_t *ipha, ire_t *ire)
{
mblk_t *first_mp;
boolean_t mctl_present;
@@ -12512,7 +12514,11 @@ ip_options_cksum(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire)
if (!mctl_present) {
sum = ip_csum_hdr(ipha);
if (sum != 0) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ if (ill != NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInCksumErrs);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsInCksumErrs);
+ }
freemsg(first_mp);
return (B_FALSE);
}
@@ -12548,6 +12554,7 @@ ip_udp_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
EXTRACT_PKT_MP(mp, first_mp, mctl_present);
ASSERT(!mctl_present || ipsec_in_is_secure(first_mp));
ASSERT(ipha->ipha_protocol == IPPROTO_UDP);
+ ASSERT(ill != NULL);
/*
* FAST PATH for udp packets
@@ -12578,7 +12585,7 @@ ip_udp_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
* back from AH/ESP as we already did it.
*/
if (!mctl_present && sum != 0 && sum != 0xFFFF) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInCksumErrs);
freemsg(first_mp);
return;
}
@@ -12637,8 +12644,7 @@ ip_udp_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
mp, mp1, cksum_err);
if (cksum_err) {
- BUMP_MIB(&ip_mib, udpInCksumErrs);
-
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsInCksumErrs);
if (hck_flags & HCK_FULLCKSUM)
IP_STAT(ip_udp_in_full_hw_cksum_err);
else if (hck_flags & HCK_PARTIALCKSUM)
@@ -12662,10 +12668,11 @@ ip_udp_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
if (CONN_UDP_FLOWCTLD(connp)) {
freemsg(mp);
- BUMP_MIB(&ip_mib, udpInOverflows);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsInOverflows);
} else {
if (!mctl_present) {
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsHCInDelivers);
}
/*
* mp and first_mp can change.
@@ -12697,7 +12704,7 @@ ip_udp_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
goto udpslowpath;
ipoptions:
- if (!ip_options_cksum(q, mp, ipha, ire)) {
+ if (!ip_options_cksum(q, ill, mp, ipha, ire)) {
goto slow_done;
}
@@ -12729,7 +12736,7 @@ fragmented:
if ((MBLKL(mp)) < (u1 + UDPH_SIZE)) {
udppullup:
if (!pullupmsg(mp, u1 + UDPH_SIZE)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
goto slow_done;
}
@@ -12753,7 +12760,7 @@ udppullup:
iphs[9] + up[2], sum, cksum_err);
if (cksum_err) {
- BUMP_MIB(&ip_mib, udpInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsInCksumErrs);
if (reass_hck_flags & HCK_FULLCKSUM)
IP_STAT(ip_udp_in_full_hw_cksum_err);
@@ -12808,6 +12815,7 @@ ip_tcp_input(mblk_t *mp, ipha_t *ipha, ill_t *recv_ill, boolean_t mctl_present,
#define rptr ((uchar_t *)ipha)
ASSERT(ipha->ipha_protocol == IPPROTO_TCP);
+ ASSERT(ill != NULL);
/*
* FAST PATH for tcp packets
@@ -12838,7 +12846,8 @@ ip_tcp_input(mblk_t *mp, ipha_t *ipha, ill_t *recv_ill, boolean_t mctl_present,
* is coming back from AH/ESP as we already did it.
*/
if (!mctl_present && (sum != 0) && sum != 0xFFFF) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInCksumErrs);
goto error;
}
}
@@ -12919,7 +12928,7 @@ ip_tcp_input(mblk_t *mp, ipha_t *ipha, ill_t *recv_ill, boolean_t mctl_present,
mp, mp1, cksum_err);
if (cksum_err) {
- BUMP_MIB(&ip_mib, tcpInErrs);
+ BUMP_MIB(ill->ill_ip_mib, tcpIfStatsInErrs);
if (hck_flags & HCK_FULLCKSUM)
IP_STAT(ip_tcp_in_full_hw_cksum_err);
@@ -12955,6 +12964,7 @@ try_again:
if (IPCL_IS_TCP4_CONNECTED_NO_POLICY(connp) && !mctl_present &&
!IPP_ENABLED(IPP_LOCAL_IN)) {
ASSERT(first_mp == mp);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
SET_SQUEUE(mp, tcp_rput_data, connp);
return (mp);
}
@@ -12967,10 +12977,14 @@ try_again:
(intptr_t)ip_squeue_get(ill_ring);
if (IPCL_IS_FULLY_BOUND(connp) && !mctl_present &&
!CONN_INBOUND_POLICY_PRESENT(connp)) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsHCInDelivers);
SET_SQUEUE(mp, connp->conn_recv, connp);
return (mp);
} else if (IPCL_IS_BOUND(connp) && !mctl_present &&
!CONN_INBOUND_POLICY_PRESENT(connp)) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsHCInDelivers);
ip_squeue_enter_unbound++;
SET_SQUEUE(mp, tcp_conn_request_unbound,
connp);
@@ -12984,6 +12998,7 @@ try_again:
if (IPCL_IS_TCP(connp) && IPCL_IS_BOUND(connp) && !syn_present) {
uint_t flags = (unsigned int)tcph->th_flags[0] & 0xFF;
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
/* No need to send this packet to TCP */
if ((flags & TH_RST) || (flags & TH_URG)) {
CONN_DEC_REF(connp);
@@ -13005,6 +13020,7 @@ try_again:
first_mp = ipsec_check_inbound_policy(first_mp, connp,
ipha, NULL, mctl_present);
if (first_mp == NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
return (NULL);
}
@@ -13061,6 +13077,7 @@ try_again:
if (!syn_present && connp->conn_ipv6_recvpktinfo) {
mp = ip_add_info(mp, recv_ill, flags);
if (mp == NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
if (mctl_present)
freeb(first_mp);
@@ -13076,6 +13093,7 @@ try_again:
}
}
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
if (IPCL_IS_TCP(connp)) {
SET_SQUEUE(first_mp, connp->conn_recv, connp);
return (first_mp);
@@ -13095,11 +13113,12 @@ no_conn:
return (NULL);
}
}
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
+
tcp_xmit_listeners_reset(first_mp, IPH_HDR_LENGTH(mp->b_rptr), zoneid);
return (NULL);
ipoptions:
- if (!ip_options_cksum(q, first_mp, ipha, ire)) {
+ if (!ip_options_cksum(q, ill, first_mp, ipha, ire)) {
goto slow_done;
}
@@ -13132,7 +13151,7 @@ fragmented:
if (len < (u1 + 20)) {
tcppullup:
if (!pullupmsg(mp, u1 + 20)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto error;
}
ipha = (ipha_t *)mp->b_rptr;
@@ -13147,7 +13166,7 @@ tcppullup:
if (offset != 5) {
tcpoptions:
if (offset < 5) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto error;
}
/*
@@ -13158,7 +13177,7 @@ tcpoptions:
offset += u1;
if (len < offset) {
if (!pullupmsg(mp, offset)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto error;
}
ipha = (ipha_t *)mp->b_rptr;
@@ -13200,7 +13219,7 @@ multipkttcp:
*/
IP_STAT(ip_in_sw_cksum);
if (IP_CSUM(mp, (int32_t)((uchar_t *)up - rptr), u1) != 0) {
- BUMP_MIB(&ip_mib, tcpInErrs);
+ BUMP_MIB(ill->ill_ip_mib, tcpIfStatsInErrs);
goto error;
}
@@ -13236,6 +13255,7 @@ ip_sctp_input(mblk_t *mp, ipha_t *ipha, ill_t *recv_ill, boolean_t mctl_present,
#define rptr ((uchar_t *)ipha)
ASSERT(ipha->ipha_protocol == IPPROTO_SCTP);
+ ASSERT(ill != NULL);
/* u1 is # words of IP options */
u1 = ipha->ipha_version_and_hdr_length - (uchar_t)((IP_VERSION << 4)
@@ -13259,7 +13279,7 @@ ip_sctp_input(mblk_t *mp, ipha_t *ipha, ill_t *recv_ill, boolean_t mctl_present,
* is coming back from AH/ESP as we already did it.
*/
if (!mctl_present && (sum != 0) && sum != 0xFFFF) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInCksumErrs);
goto error;
}
}
@@ -13293,7 +13313,7 @@ find_sctp_client:
if (len < (u1 + SCTP_COMMON_HDR_LENGTH)) {
if (mp->b_cont == NULL ||
!pullupmsg(mp, u1 + SCTP_COMMON_HDR_LENGTH)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto error;
}
ipha = (ipha_t *)mp->b_rptr;
@@ -13329,7 +13349,7 @@ find_sctp_client:
}
/* Found a client; up it goes */
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
sctp_input(connp, ipha, mp, first_mp, recv_ill, B_TRUE, mctl_present);
return;
@@ -13340,7 +13360,7 @@ no_conn:
ipoptions:
DB_CKSUMFLAGS(mp) = 0;
- if (!ip_options_cksum(q, first_mp, ipha, ire))
+ if (!ip_options_cksum(q, ill, first_mp, ipha, ire))
goto slow_done;
UPDATE_IB_PKT_COUNT(ire);
@@ -13377,7 +13397,7 @@ slow_done:
#define VERSION_6 0x60
static boolean_t
-ip_rput_multimblk_ipoptions(queue_t *q, mblk_t *mp, ipha_t **iphapp,
+ip_rput_multimblk_ipoptions(queue_t *q, ill_t *ill, mblk_t *mp, ipha_t **iphapp,
ipaddr_t *dstp)
{
uint_t opt_len;
@@ -13385,13 +13405,14 @@ ip_rput_multimblk_ipoptions(queue_t *q, mblk_t *mp, ipha_t **iphapp,
ssize_t len;
uint_t pkt_len;
+ ASSERT(ill != NULL);
IP_STAT(ip_ipoptions);
ipha = *iphapp;
#define rptr ((uchar_t *)ipha)
/* Assume no IPv6 packets arrive over the IPv4 queue */
if (IPH_HDR_VERSION(ipha) == IPV6_VERSION) {
- BUMP_MIB(&ip_mib, ipInIPv6);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInWrongIPVersion);
freemsg(mp);
return (B_FALSE);
}
@@ -13404,7 +13425,7 @@ ip_rput_multimblk_ipoptions(queue_t *q, mblk_t *mp, ipha_t **iphapp,
if (opt_len) {
/* IP Options present! Validate and process. */
if (opt_len > (15 - IP_SIMPLE_HDR_LENGTH_IN_WORDS)) {
- BUMP_MIB(&ip_mib, ipInHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
goto done;
}
/*
@@ -13414,11 +13435,11 @@ ip_rput_multimblk_ipoptions(queue_t *q, mblk_t *mp, ipha_t **iphapp,
len = ((size_t)opt_len + IP_SIMPLE_HDR_LENGTH_IN_WORDS) << 2;
if (len > (mp->b_wptr - rptr)) {
if (len > pkt_len) {
- BUMP_MIB(&ip_mib, ipInHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
goto done;
}
if (!pullupmsg(mp, len)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto done;
}
ipha = (ipha_t *)mp->b_rptr;
@@ -13430,6 +13451,7 @@ ip_rput_multimblk_ipoptions(queue_t *q, mblk_t *mp, ipha_t **iphapp,
*/
IP_STAT(ip_opt);
if (ip_rput_options(q, mp, ipha, dstp) == -1) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return (B_FALSE);
}
}
@@ -13475,7 +13497,7 @@ ip_rput_noire(queue_t *q, ill_t *in_ill, mblk_t *mp, int ll_multicast,
return (NULL);
}
if (!(ill->ill_flags & ILLF_ROUTER) && !ip_source_routed(ipha)) {
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
freemsg(mp);
return (NULL);
}
@@ -13549,6 +13571,8 @@ ip_check_and_align_header(queue_t *q, mblk_t *mp)
len = MBLKL(mp);
if (!OK_32PTR(mp->b_rptr) || len < IP_SIMPLE_HDR_LENGTH) {
+ ill = (ill_t *)q->q_ptr;
+
if (!OK_32PTR(mp->b_rptr))
IP_STAT(ip_notaligned1);
else
@@ -13557,13 +13581,12 @@ ip_check_and_align_header(queue_t *q, mblk_t *mp)
if (len < 0) {
/* clear b_prev - used by ip_mroute_decap */
mp->b_prev = NULL;
- BUMP_MIB(&ip_mib, ipInHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
freemsg(mp);
return (B_FALSE);
}
if (ip_rput_pullups++ == 0) {
- ill = (ill_t *)q->q_ptr;
ipha = (ipha_t *)mp->b_rptr;
(void) mi_strlog(q, 1, SL_ERROR|SL_TRACE,
"ip_check_and_align_header: %s forced us to "
@@ -13573,7 +13596,7 @@ ip_check_and_align_header(queue_t *q, mblk_t *mp)
if (!pullupmsg(mp, IP_SIMPLE_HDR_LENGTH)) {
/* clear b_prev - used by ip_mroute_decap */
mp->b_prev = NULL;
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
return (B_FALSE);
}
@@ -13637,7 +13660,7 @@ ip_rput_notforus(queue_t **qp, mblk_t *mp, ire_t *ire, ill_t *ill)
ire->ire_ipif->ipif_ill->ill_flags &
ILLF_ROUTER) == 0)) {
/* Drop packet */
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
freemsg(mp);
return (B_TRUE);
}
@@ -13662,6 +13685,7 @@ ip_fast_forward(ire_t *ire, ipaddr_t dst, ill_t *ill, mblk_t *mp)
ire_t *src_ire = NULL;
ill_t *stq_ill;
uint_t hlen;
+ uint_t pkt_len;
uint32_t sum;
queue_t *dev_q;
boolean_t check_multirt = B_FALSE;
@@ -13679,17 +13703,18 @@ ip_fast_forward(ire_t *ire, ipaddr_t dst, ill_t *ill, mblk_t *mp)
if (ip_dst == INADDR_ANY || IN_BADCLASS(ip_dst) ||
IN_CLASSD(ip_src)) {
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
goto drop;
}
src_ire = ire_ctable_lookup(ipha->ipha_src, 0, IRE_BROADCAST, NULL,
ALL_ZONES, NULL, MATCH_IRE_TYPE);
if (src_ire != NULL) {
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
goto drop;
}
+
/* No ire cache of nexthop. So first create one */
if (ire == NULL) {
ire = ire_forward(dst, &check_multirt, NULL, NULL, NULL);
@@ -13700,7 +13725,9 @@ ip_fast_forward(ire_t *ire, ipaddr_t dst, ill_t *ill, mblk_t *mp)
*/
ASSERT(!check_multirt);
if (ire == NULL) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ /* An attempt was made to forward the packet */
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInForwDatagrams);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
mp->b_prev = mp->b_next = 0;
/* send icmp unreachable */
/* Sent by forwarding path, and router is global zone */
@@ -13728,6 +13755,7 @@ ip_fast_forward(ire_t *ire, ipaddr_t dst, ill_t *ill, mblk_t *mp)
* The codeflow from here on is thus:
* ip_rput_process_forward->ip_rput_forward->ip_xmit_v4
*/
+ pkt_len = ntohs(ipha->ipha_length);
stq_ill = (ill_t *)ire->ire_stq->q_ptr;
if (!(stq_ill->ill_flags & ILLF_ROUTER) ||
!(ill->ill_flags & ILLF_ROUTER) ||
@@ -13735,12 +13763,13 @@ ip_fast_forward(ire_t *ire, ipaddr_t dst, ill_t *ill, mblk_t *mp)
(ill->ill_group != NULL && ill->ill_group == stq_ill->ill_group) ||
(ire->ire_nce == NULL) ||
(ire->ire_nce->nce_state != ND_REACHABLE) ||
- (ntohs(ipha->ipha_length) > ire->ire_max_frag) ||
+ (pkt_len > ire->ire_max_frag) ||
ipha->ipha_ttl <= 1) {
ip_rput_process_forward(ill->ill_rq, mp, ire,
ipha, ill, B_FALSE);
return (ire);
}
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInForwDatagrams);
DTRACE_PROBE4(ip4__forwarding__start,
ill_t *, ill, ill_t *, stq_ill, ipha_t *, ipha, mblk_t *, mp);
@@ -13786,14 +13815,18 @@ ip_fast_forward(ire_t *ire, ipaddr_t dst, ill_t *ill, mblk_t *mp)
UPDATE_IB_PKT_COUNT(ire);
ire->ire_last_used_time = lbolt;
- BUMP_MIB(&ip_mib, ipForwDatagrams);
+ BUMP_MIB(stq_ill->ill_ip_mib,
+ ipIfStatsHCOutForwDatagrams);
+ BUMP_MIB(stq_ill->ill_ip_mib, ipIfStatsHCOutTransmits);
+ UPDATE_MIB(stq_ill->ill_ip_mib, ipIfStatsHCOutOctets,
+ pkt_len);
putnext(ire->ire_stq, mp);
return (ire);
}
}
indiscard:
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
drop:
if (mp != NULL)
freemsg(mp);
@@ -13823,8 +13856,10 @@ ip_rput_process_forward(queue_t *q, mblk_t *mp, ire_t *ire, ipha_t *ipha,
mp->b_prev = NULL; /* ip_rput_noire sets incoming interface here */
mp->b_next = NULL; /* ip_rput_noire sets dst here */
- if (ll_multicast != 0)
+ if (ll_multicast != 0) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto drop_pkt;
+ }
/*
* check if ipha_src is a broadcast address. Note that this
@@ -13840,7 +13875,7 @@ ip_rput_process_forward(queue_t *q, mblk_t *mp, ire_t *ire, ipha_t *ipha,
IN_BADCLASS(ntohl(ipha->ipha_dst))) {
if (src_ire != NULL)
ire_refrele(src_ire);
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
ip2dbg(("ip_rput_process_forward: Received packet with"
" bad src/dst address on %s\n", ill->ill_name));
goto drop_pkt;
@@ -13865,7 +13900,7 @@ ip_rput_process_forward(queue_t *q, mblk_t *mp, ire_t *ire, ipha_t *ipha,
ILLF_ROUTER) == 0) &&
!(ip_source_routed(ipha) && (ire->ire_rfq == q ||
(ill_group != NULL && ill_group == ire_group)))) {
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
if (ip_source_routed(ipha)) {
q = WR(q);
/*
@@ -13881,6 +13916,8 @@ ip_rput_process_forward(queue_t *q, mblk_t *mp, ire_t *ire, ipha_t *ipha,
goto drop_pkt;
}
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInForwDatagrams);
+
/* Packet is being forwarded. Turning off hwcksum flag. */
DB_CKSUMFLAGS(mp) = 0;
if (ip_g_send_redirects) {
@@ -13965,7 +14002,7 @@ ip_rput_process_forward(queue_t *q, mblk_t *mp, ire_t *ire, ipha_t *ipha,
sendit:
dev_q = ire->ire_stq->q_next;
if ((dev_q->q_next || dev_q->q_first) && !canput(dev_q)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -13987,6 +14024,8 @@ ip_rput_process_broadcast(queue_t **qp, mblk_t *mp, ire_t *ire, ipha_t *ipha,
q = *qp;
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInBcastPkts);
+
/*
* Clear the indication that this may have hardware
* checksum as we are not using it for forwarding.
@@ -14001,7 +14040,7 @@ ip_rput_process_broadcast(queue_t **qp, mblk_t *mp, ire_t *ire, ipha_t *ipha,
if (ipha->ipha_protocol == IPPROTO_TCP) {
ire_refrele(ire);
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return (NULL);
}
/*
@@ -14027,7 +14066,7 @@ ip_rput_process_broadcast(queue_t **qp, mblk_t *mp, ire_t *ire, ipha_t *ipha,
if (ipif == NULL) {
ire_refrele(ire);
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return (NULL);
}
new_ire = ire_ctable_lookup(dst, 0, 0,
@@ -14039,7 +14078,7 @@ ip_rput_process_broadcast(queue_t **qp, mblk_t *mp, ire_t *ire, ipha_t *ipha,
ire_refrele(ire);
ire_refrele(new_ire);
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return (NULL);
}
/*
@@ -14069,7 +14108,7 @@ ip_rput_process_broadcast(queue_t **qp, mblk_t *mp, ire_t *ire, ipha_t *ipha,
*/
ire_refrele(ire);
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return (NULL);
}
} else {
@@ -14144,7 +14183,7 @@ ip_rput_process_broadcast(queue_t **qp, mblk_t *mp, ire_t *ire, ipha_t *ipha,
* will decrement it by one.
*/
if (ip_csum_hdr(ipha)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInCksumErrs);
ip2dbg(("ip_rput_broadcast:drop pkt\n"));
freemsg(mp);
ire_refrele(ire);
@@ -14173,6 +14212,10 @@ static boolean_t
ip_rput_process_multicast(queue_t *q, mblk_t *mp, ill_t *ill, ipha_t *ipha,
int *ll_multicast, ipaddr_t *dstp)
{
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInMcastPkts);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCInMcastOctets,
+ ntohs(ipha->ipha_length));
+
/*
* Forward packets only if we have joined the allmulti
* group on this interface.
@@ -14296,7 +14339,11 @@ ip_rput_process_notdata(queue_t *q, mblk_t **first_mpp, ill_t *ill,
mp1->b_prev = NULL;
}
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ if (ill != NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsInDiscards);
+ }
return (B_TRUE);
}
for (from_mp = mp, to_mp = mp1; from_mp != NULL;
@@ -14535,7 +14582,7 @@ ip_rput(queue_t *q, mblk_t *mp)
/* clear b_prev - used by ip_mroute_decap */
mp->b_prev = NULL;
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
TRACE_2(TR_FAC_IP, TR_IP_RPUT_END,
"ip_rput_end: q %p (%S)", q, "copymsg");
return;
@@ -14654,12 +14701,16 @@ ip_input(ill_t *ill, ill_rx_ring_t *ip_ring, mblk_t *mp_chain,
ipha = (ipha_t *)mp->b_rptr;
len = mp->b_wptr - rptr;
+ pkt_len = ntohs(ipha->ipha_length);
- BUMP_MIB(&ip_mib, ipInReceives);
-
+ /*
+ * We must count all incoming packets, even if they end
+ * up being dropped later on.
+ */
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInReceives);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCInOctets, pkt_len);
/* multiple mblk or too short */
- pkt_len = ntohs(ipha->ipha_length);
len -= pkt_len;
if (len != 0) {
/*
@@ -14668,15 +14719,17 @@ ip_input(ill_t *ill, ill_rx_ring_t *ip_ring, mblk_t *mp_chain,
*/
if (mp->b_cont == NULL) {
if (len < 0 || pkt_len < IP_SIMPLE_HDR_LENGTH) {
- BUMP_MIB(&ip_mib, ipInHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInHdrErrors);
ip2dbg(("ip_input: drop pkt\n"));
freemsg(mp);
continue;
}
mp->b_wptr = rptr + pkt_len;
- } else if (len += msgdsize(mp->b_cont)) {
+ } else if ((len += msgdsize(mp->b_cont)) != 0) {
if (len < 0 || pkt_len < IP_SIMPLE_HDR_LENGTH) {
- BUMP_MIB(&ip_mib, ipInHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInHdrErrors);
ip2dbg(("ip_input: drop pkt\n"));
freemsg(mp);
continue;
@@ -14691,7 +14744,7 @@ ip_input(ill_t *ill, ill_rx_ring_t *ip_ring, mblk_t *mp_chain,
if (IP_LOOPBACK_ADDR(dst) ||
IP_LOOPBACK_ADDR(ipha->ipha_src)) {
- BUMP_MIB(&ip_mib, ipInAddrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInAddrErrors);
cmn_err(CE_CONT, "dst %X src %X\n",
dst, ipha->ipha_src);
freemsg(mp);
@@ -14724,7 +14777,7 @@ ip_input(ill_t *ill, ill_rx_ring_t *ip_ring, mblk_t *mp_chain,
*/
if (is_system_labeled() &&
!tsol_get_pkt_label(mp, IPV4_VERSION)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
continue;
}
@@ -14786,7 +14839,8 @@ ip_input(ill_t *ill, ill_rx_ring_t *ip_ring, mblk_t *mp_chain,
IP_STAT(ip_multimblk4);
else
IP_STAT(ip_ipoptions);
- if (!ip_rput_multimblk_ipoptions(q, mp, &ipha, &dst))
+ if (!ip_rput_multimblk_ipoptions(q, ill, mp, &ipha,
+ &dst))
continue;
}
@@ -16310,9 +16364,11 @@ ip_rput_forward(ire_t *ire, ipha_t *ipha, mblk_t *mp, ill_t *in_ill)
uint32_t max_frag;
uint32_t ill_index;
ill_t *out_ill;
+ mib2_ipIfStatsEntry_t *mibptr;
/* Get the ill_index of the incoming ILL */
ill_index = (in_ill != NULL) ? in_ill->ill_phyint->phyint_ifindex : 0;
+ mibptr = (in_ill != NULL) ? in_ill->ill_ip_mib : &ip_mib;
/* Initiate Read side IPPF processing */
if (IPP_ENABLED(IPP_FWD_IN)) {
@@ -16332,7 +16388,7 @@ ip_rput_forward(ire_t *ire, ipha_t *ipha, mblk_t *mp, ill_t *in_ill)
if (ipha->ipha_ttl-- <= 1) {
if (ip_csum_hdr(ipha)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(mibptr, ipIfStatsInCksumErrs);
goto drop_pkt;
}
/*
@@ -16342,6 +16398,7 @@ ip_rput_forward(ire_t *ire, ipha_t *ipha, mblk_t *mp, ill_t *in_ill)
* problems since we don't generate ICMP errors for
* multicast packets.
*/
+ BUMP_MIB(mibptr, ipIfStatsForwProhibits);
q = ire->ire_stq;
if (q != NULL) {
/* Sent by forwarding path, and router is global zone */
@@ -16356,7 +16413,7 @@ ip_rput_forward(ire_t *ire, ipha_t *ipha, mblk_t *mp, ill_t *in_ill)
* Don't forward if the interface is down
*/
if (ire->ire_ipif->ipif_ill->ill_ipif_up_count == 0) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(mibptr, ipIfStatsInDiscards);
ip2dbg(("ip_rput_forward:interface is down\n"));
goto drop_pkt;
}
@@ -16382,7 +16439,7 @@ ip_rput_forward(ire_t *ire, ipha_t *ipha, mblk_t *mp, ill_t *in_ill)
mblk_t *mp1;
if ((mp1 = tsol_ip_forward(ire, mp)) == NULL) {
- BUMP_MIB(&ip_mib, ipForwProhibits);
+ BUMP_MIB(mibptr, ipIfStatsForwProhibits);
goto drop_pkt;
}
/* Size may have changed */
@@ -16394,10 +16451,11 @@ ip_rput_forward(ire_t *ire, ipha_t *ipha, mblk_t *mp, ill_t *in_ill)
/* Check if there are options to update */
if (!IS_SIMPLE_IPH(ipha)) {
if (ip_csum_hdr(ipha)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(mibptr, ipIfStatsInCksumErrs);
goto drop_pkt;
}
if (ip_rput_forward_options(mp, ipha, ire)) {
+ BUMP_MIB(mibptr, ipIfStatsForwProhibits);
return;
}
@@ -16414,7 +16472,7 @@ ip_rput_forward(ire_t *ire, ipha_t *ipha, mblk_t *mp, ill_t *in_ill)
* was good coming in.
*/
if (ip_csum_hdr(ipha)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(mibptr, ipIfStatsInCksumErrs);
goto drop_pkt;
}
/* Initiate Write side IPPF processing */
@@ -16513,7 +16571,6 @@ ip_rput_forward_options(mblk_t *mp, ipha_t *ipha, ire_t *ire)
case IPOPT_LSRR:
/* Check if adminstratively disabled */
if (!ip_forward_src_routed) {
- BUMP_MIB(&ip_mib, ipForwProhibits);
if (ire->ire_stq != NULL) {
/*
* Sent by forwarding path, and router
@@ -16940,6 +16997,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
"ip_rput_locl_start: q %p", q);
ASSERT(ire->ire_ipversion == IPV4_VERSION);
+ ASSERT(ill != NULL);
#define rptr ((uchar_t *)ipha)
@@ -16992,7 +17050,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
+ IP_SIMPLE_HDR_LENGTH_IN_WORDS);
if (u1) {
- if (!ip_options_cksum(q, mp, ipha, ire)) {
+ if (!ip_options_cksum(q, ill, mp, ipha, ire)) {
if (hada_mp != NULL)
freemsg(hada_mp);
return;
@@ -17011,7 +17069,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
* back from AH/ESP as we already did it.
*/
if (!mctl_present && (sum && sum != 0xFFFF)) {
- BUMP_MIB(&ip_mib, ipInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInCksumErrs);
goto drop_pkt;
}
}
@@ -17154,7 +17212,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
if (is_system_labeled() && !tsol_can_accept_raw(mp, B_TRUE)) {
freemsg(first_mp);
ip1dbg(("ip_proto_input: zone all cannot accept raw"));
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return;
}
if ((mp = igmp_input(q, mp, ill)) == NULL) {
@@ -17194,7 +17252,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
if (is_system_labeled() && !tsol_can_accept_raw(mp, B_TRUE)) {
freemsg(first_mp);
ip1dbg(("ip_proto_input: zone all cannot accept PIM"));
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return;
}
if (pim_input(q, mp) != 0) {
@@ -17227,7 +17285,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
mp->b_wptr) {
if (!pullupmsg(mp, (uchar_t *)ipha + hdr_length +
sizeof (ipha_t) - mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -17238,12 +17296,12 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
* Check the sanity of the inner IP header.
*/
if ((IPH_HDR_VERSION(inner_ipha) != IPV4_VERSION)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
if (IPH_HDR_LENGTH(inner_ipha) < sizeof (ipha_t)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -17280,7 +17338,8 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
NULL) {
ip1dbg(("ip_proto_input: IPSEC_IN "
"allocation failure.\n"));
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -17309,7 +17368,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
* times. We don't want to recurse infinitely.
* To keep it simple, drop the packet.
*/
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -17338,7 +17397,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
ip1dbg(("ip_proto_input: IPSEC_IN "
"allocation failure.\n"));
freemsg(hada_mp); /* okay ifnull */
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -17396,7 +17455,7 @@ ip_proto_input(queue_t *q, mblk_t *mp, ipha_t *ipha, ire_t *ire,
case IPSEC_STATUS_SUCCESS:
break;
case IPSEC_STATUS_FAILED:
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
/* FALLTHRU */
case IPSEC_STATUS_PENDING:
return;
@@ -17841,12 +17900,11 @@ bad_src_route:
int
ip_snmp_get(queue_t *q, mblk_t *mpctl)
{
-
if (mpctl == NULL || mpctl->b_cont == NULL) {
return (0);
}
- if ((mpctl = ip_snmp_get_mib2_ip(q, mpctl)) == NULL) {
+ if ((mpctl = ip_snmp_get_mib2_ip_traffic_stats(q, mpctl)) == NULL) {
return (1);
}
@@ -17918,10 +17976,11 @@ ip_snmp_get(queue_t *q, mblk_t *mpctl)
}
-/* Get global IPv4 statistics */
+/* Get global (legacy) IPv4 statistics */
static mblk_t *
-ip_snmp_get_mib2_ip(queue_t *q, mblk_t *mpctl)
+ip_snmp_get_mib2_ip(queue_t *q, mblk_t *mpctl, mib2_ipIfStatsEntry_t *ipmib)
{
+ mib2_ip_t old_ip_mib;
struct opthdr *optp;
mblk_t *mp2ctl;
@@ -17934,26 +17993,74 @@ ip_snmp_get_mib2_ip(queue_t *q, mblk_t *mpctl)
optp = (struct opthdr *)&mpctl->b_rptr[sizeof (struct T_optmgmt_ack)];
optp->level = MIB2_IP;
optp->name = 0;
- SET_MIB(ip_mib.ipForwarding,
+ SET_MIB(old_ip_mib.ipForwarding,
(WE_ARE_FORWARDING ? 1 : 2));
- SET_MIB(ip_mib.ipDefaultTTL,
+ SET_MIB(old_ip_mib.ipDefaultTTL,
(uint32_t)ip_def_ttl);
- SET_MIB(ip_mib.ipReasmTimeout,
+ SET_MIB(old_ip_mib.ipReasmTimeout,
ip_g_frag_timeout);
- SET_MIB(ip_mib.ipAddrEntrySize,
+ SET_MIB(old_ip_mib.ipAddrEntrySize,
sizeof (mib2_ipAddrEntry_t));
- SET_MIB(ip_mib.ipRouteEntrySize,
+ SET_MIB(old_ip_mib.ipRouteEntrySize,
sizeof (mib2_ipRouteEntry_t));
- SET_MIB(ip_mib.ipNetToMediaEntrySize,
+ SET_MIB(old_ip_mib.ipNetToMediaEntrySize,
sizeof (mib2_ipNetToMediaEntry_t));
- SET_MIB(ip_mib.ipMemberEntrySize, sizeof (ip_member_t));
- SET_MIB(ip_mib.ipGroupSourceEntrySize, sizeof (ip_grpsrc_t));
- SET_MIB(ip_mib.ipRouteAttributeSize, sizeof (mib2_ipAttributeEntry_t));
- SET_MIB(ip_mib.transportMLPSize, sizeof (mib2_transportMLPEntry_t));
- if (!snmp_append_data(mpctl->b_cont, (char *)&ip_mib,
- (int)sizeof (ip_mib))) {
+ SET_MIB(old_ip_mib.ipMemberEntrySize, sizeof (ip_member_t));
+ SET_MIB(old_ip_mib.ipGroupSourceEntrySize, sizeof (ip_grpsrc_t));
+ SET_MIB(old_ip_mib.ipRouteAttributeSize,
+ sizeof (mib2_ipAttributeEntry_t));
+ SET_MIB(old_ip_mib.transportMLPSize, sizeof (mib2_transportMLPEntry_t));
+
+ /*
+ * Grab the statistics from the new IP MIB
+ */
+ SET_MIB(old_ip_mib.ipInReceives,
+ (uint32_t)ipmib->ipIfStatsHCInReceives);
+ SET_MIB(old_ip_mib.ipInHdrErrors, ipmib->ipIfStatsInHdrErrors);
+ SET_MIB(old_ip_mib.ipInAddrErrors, ipmib->ipIfStatsInAddrErrors);
+ SET_MIB(old_ip_mib.ipForwDatagrams,
+ (uint32_t)ipmib->ipIfStatsHCOutForwDatagrams);
+ SET_MIB(old_ip_mib.ipInUnknownProtos,
+ ipmib->ipIfStatsInUnknownProtos);
+ SET_MIB(old_ip_mib.ipInDiscards, ipmib->ipIfStatsInDiscards);
+ SET_MIB(old_ip_mib.ipInDelivers,
+ (uint32_t)ipmib->ipIfStatsHCInDelivers);
+ SET_MIB(old_ip_mib.ipOutRequests,
+ (uint32_t)ipmib->ipIfStatsHCOutRequests);
+ SET_MIB(old_ip_mib.ipOutDiscards, ipmib->ipIfStatsOutDiscards);
+ SET_MIB(old_ip_mib.ipOutNoRoutes, ipmib->ipIfStatsOutNoRoutes);
+ SET_MIB(old_ip_mib.ipReasmReqds, ipmib->ipIfStatsReasmReqds);
+ SET_MIB(old_ip_mib.ipReasmOKs, ipmib->ipIfStatsReasmOKs);
+ SET_MIB(old_ip_mib.ipReasmFails, ipmib->ipIfStatsReasmFails);
+ SET_MIB(old_ip_mib.ipFragOKs, ipmib->ipIfStatsOutFragOKs);
+ SET_MIB(old_ip_mib.ipFragFails, ipmib->ipIfStatsOutFragFails);
+ SET_MIB(old_ip_mib.ipFragCreates, ipmib->ipIfStatsOutFragCreates);
+
+ /* ipRoutingDiscards is not being used */
+ SET_MIB(old_ip_mib.ipRoutingDiscards, 0);
+ SET_MIB(old_ip_mib.tcpInErrs, ipmib->tcpIfStatsInErrs);
+ SET_MIB(old_ip_mib.udpNoPorts, ipmib->udpIfStatsNoPorts);
+ SET_MIB(old_ip_mib.ipInCksumErrs, ipmib->ipIfStatsInCksumErrs);
+ SET_MIB(old_ip_mib.ipReasmDuplicates,
+ ipmib->ipIfStatsReasmDuplicates);
+ SET_MIB(old_ip_mib.ipReasmPartDups, ipmib->ipIfStatsReasmPartDups);
+ SET_MIB(old_ip_mib.ipForwProhibits, ipmib->ipIfStatsForwProhibits);
+ SET_MIB(old_ip_mib.udpInCksumErrs, ipmib->udpIfStatsInCksumErrs);
+ SET_MIB(old_ip_mib.udpInOverflows, ipmib->udpIfStatsInOverflows);
+ SET_MIB(old_ip_mib.rawipInOverflows,
+ ipmib->rawipIfStatsInOverflows);
+
+ SET_MIB(old_ip_mib.ipsecInSucceeded, ipmib->ipsecIfStatsInSucceeded);
+ SET_MIB(old_ip_mib.ipsecInFailed, ipmib->ipsecIfStatsInFailed);
+ SET_MIB(old_ip_mib.ipInIPv6, ipmib->ipIfStatsInWrongIPVersion);
+ SET_MIB(old_ip_mib.ipOutIPv6, ipmib->ipIfStatsOutWrongIPVersion);
+ SET_MIB(old_ip_mib.ipOutSwitchIPv6,
+ ipmib->ipIfStatsOutSwitchIPVersion);
+
+ if (!snmp_append_data(mpctl->b_cont, (char *)&old_ip_mib,
+ (int)sizeof (old_ip_mib))) {
ip1dbg(("ip_snmp_get_mib2_ip: failed to allocate %u bytes\n",
- (uint_t)sizeof (ip_mib)));
+ (uint_t)sizeof (old_ip_mib)));
}
optp->len = (t_uscalar_t)msgdsize(mpctl->b_cont);
@@ -17963,6 +18070,77 @@ ip_snmp_get_mib2_ip(queue_t *q, mblk_t *mpctl)
return (mp2ctl);
}
+/* Per interface IPv4 statistics */
+static mblk_t *
+ip_snmp_get_mib2_ip_traffic_stats(queue_t *q, mblk_t *mpctl)
+{
+ struct opthdr *optp;
+ mblk_t *mp2ctl;
+ ill_t *ill;
+ ill_walk_context_t ctx;
+ mblk_t *mp_tail = NULL;
+ mib2_ipIfStatsEntry_t global_ip_mib;
+
+ /*
+ * Make a copy of the original message
+ */
+ mp2ctl = copymsg(mpctl);
+
+ optp = (struct opthdr *)&mpctl->b_rptr[sizeof (struct T_optmgmt_ack)];
+ optp->level = MIB2_IP;
+ optp->name = MIB2_IP_TRAFFIC_STATS;
+ /* Include "unknown interface" ip_mib */
+ ip_mib.ipIfStatsIPVersion = MIB2_INETADDRESSTYPE_ipv4;
+ ip_mib.ipIfStatsIfIndex = MIB2_UNKNOWN_INTERFACE; /* Flag to netstat */
+ SET_MIB(ip_mib.ipIfStatsForwarding, (WE_ARE_FORWARDING ? 1 : 2));
+ SET_MIB(ip_mib.ipIfStatsDefaultTTL, (uint32_t)ip_def_ttl);
+ SET_MIB(ip_mib.ipIfStatsEntrySize, sizeof (mib2_ipIfStatsEntry_t));
+ SET_MIB(ip_mib.ipIfStatsAddrEntrySize, sizeof (mib2_ipAddrEntry_t));
+ SET_MIB(ip_mib.ipIfStatsRouteEntrySize, sizeof (mib2_ipRouteEntry_t));
+ SET_MIB(ip_mib.ipIfStatsNetToMediaEntrySize,
+ sizeof (mib2_ipNetToMediaEntry_t));
+ SET_MIB(ip_mib.ipIfStatsMemberEntrySize, sizeof (ip_member_t));
+ SET_MIB(ip_mib.ipIfStatsGroupSourceEntrySize, sizeof (ip_grpsrc_t));
+
+ if (!snmp_append_data2(mpctl->b_cont, &mp_tail, (char *)&ip_mib,
+ (int)sizeof (ip_mib))) {
+ ip1dbg(("ip_snmp_get_mib2_ip_traffic_stats: "
+ "failed to allocate %u bytes\n",
+ (uint_t)sizeof (ip_mib)));
+ }
+
+ bcopy(&ip_mib, &global_ip_mib, sizeof (global_ip_mib));
+
+ rw_enter(&ill_g_lock, RW_READER);
+ ill = ILL_START_WALK_V4(&ctx);
+ for (; ill != NULL; ill = ill_next(&ctx, ill)) {
+ ill->ill_ip_mib->ipIfStatsIfIndex =
+ ill->ill_phyint->phyint_ifindex;
+ SET_MIB(ill->ill_ip_mib->ipIfStatsForwarding,
+ (WE_ARE_FORWARDING ? 1 : 2));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsDefaultTTL,
+ (uint32_t)ip_def_ttl);
+
+ ip_mib2_add_ip_stats(&global_ip_mib, ill->ill_ip_mib);
+ if (!snmp_append_data2(mpctl->b_cont, &mp_tail,
+ (char *)ill->ill_ip_mib,
+ (int)sizeof (*ill->ill_ip_mib))) {
+ ip1dbg(("ip_snmp_get_mib2_ip_traffic_stats: "
+ "failed to allocate %u bytes\n",
+ (uint_t)sizeof (*ill->ill_ip_mib)));
+ }
+ }
+ rw_exit(&ill_g_lock);
+
+ optp->len = (t_uscalar_t)msgdsize(mpctl->b_cont);
+ ip3dbg(("ip_snmp_get_mib2_ip_traffic_stats: "
+ "level %d, name %d, len %d\n",
+ (int)optp->level, (int)optp->name, (int)optp->len));
+ qreply(q, mpctl);
+
+ return (ip_snmp_get_mib2_ip(q, mp2ctl, &global_ip_mib));
+}
+
/* Global IPv4 ICMP statistics */
static mblk_t *
ip_snmp_get_mib2_icmp(queue_t *q, mblk_t *mpctl)
@@ -18097,7 +18275,7 @@ ip_snmp_get_mib2_ip_addr(queue_t *q, mblk_t *mpctl)
bitval <<= 1)
noop;
mae.ipAdEntBcastAddr = bitval;
- mae.ipAdEntReasmMaxSize = 65535;
+ mae.ipAdEntReasmMaxSize = IP_MAXPACKET;
mae.ipAdEntInfo.ae_mtu = ipif->ipif_mtu;
mae.ipAdEntInfo.ae_metric = ipif->ipif_metric;
mae.ipAdEntInfo.ae_broadcast_addr =
@@ -18106,6 +18284,7 @@ ip_snmp_get_mib2_ip_addr(queue_t *q, mblk_t *mpctl)
ipif->ipif_pp_dst_addr;
mae.ipAdEntInfo.ae_flags = ipif->ipif_flags |
ill->ill_flags | ill->ill_phyint->phyint_flags;
+ mae.ipAdEntRetransmitTime = AR_EQ_DEFAULT_XMIT_INTERVAL;
if (!snmp_append_data2(mpctl->b_cont, &mp_tail,
(char *)&mae, (int)sizeof (mib2_ipAddrEntry_t))) {
@@ -18201,6 +18380,12 @@ ip_snmp_get_mib2_ip6_addr(queue_t *q, mblk_t *mpctl)
ipif->ipif_v6pp_dst_addr;
mae6.ipv6AddrInfo.ae_flags = ipif->ipif_flags |
ill->ill_flags | ill->ill_phyint->phyint_flags;
+ mae6.ipv6AddrReasmMaxSize = IP_MAXPACKET;
+ mae6.ipv6AddrIdentifier = ill->ill_token;
+ mae6.ipv6AddrIdentifierLen = ill->ill_token_length;
+ mae6.ipv6AddrReachableTime = ill->ill_reachable_time;
+ mae6.ipv6AddrRetransmitTime =
+ ill->ill_reachable_retrans_time;
if (!snmp_append_data2(mpctl->b_cont, &mp_tail,
(char *)&mae6,
(int)sizeof (mib2_ipv6AddrEntry_t))) {
@@ -18685,7 +18870,7 @@ ip_snmp_get_mib2_ip6_route_media(queue_t *q, mblk_t *mpctl)
}
/*
- * ICMPv6 mib: One per ill
+ * IPv6 mib: One per ill
*/
static mblk_t *
ip_snmp_get_mib2_ip6(queue_t *q, mblk_t *mpctl)
@@ -18707,17 +18892,31 @@ ip_snmp_get_mib2_ip6(queue_t *q, mblk_t *mpctl)
optp->level = MIB2_IP6;
optp->name = 0;
/* Include "unknown interface" ip6_mib */
- ip6_mib.ipv6IfIndex = 0; /* Flag to netstat */
- SET_MIB(ip6_mib.ipv6Forwarding, ipv6_forward ? 1 : 2);
- SET_MIB(ip6_mib.ipv6DefaultHopLimit, ipv6_def_hops);
- SET_MIB(ip6_mib.ipv6IfStatsEntrySize,
- sizeof (mib2_ipv6IfStatsEntry_t));
- SET_MIB(ip6_mib.ipv6AddrEntrySize, sizeof (mib2_ipv6AddrEntry_t));
- SET_MIB(ip6_mib.ipv6RouteEntrySize, sizeof (mib2_ipv6RouteEntry_t));
- SET_MIB(ip6_mib.ipv6NetToMediaEntrySize,
+ ip6_mib.ipIfStatsIPVersion = MIB2_INETADDRESSTYPE_ipv6;
+ ip6_mib.ipIfStatsIfIndex = MIB2_UNKNOWN_INTERFACE; /* Flag to netstat */
+ SET_MIB(ip6_mib.ipIfStatsForwarding, ipv6_forward ? 1 : 2);
+ SET_MIB(ip6_mib.ipIfStatsDefaultHopLimit, ipv6_def_hops);
+ SET_MIB(ip6_mib.ipIfStatsEntrySize,
+ sizeof (mib2_ipIfStatsEntry_t));
+ SET_MIB(ip6_mib.ipIfStatsAddrEntrySize, sizeof (mib2_ipv6AddrEntry_t));
+ SET_MIB(ip6_mib.ipIfStatsRouteEntrySize,
+ sizeof (mib2_ipv6RouteEntry_t));
+ SET_MIB(ip6_mib.ipIfStatsNetToMediaEntrySize,
sizeof (mib2_ipv6NetToMediaEntry_t));
- SET_MIB(ip6_mib.ipv6MemberEntrySize, sizeof (ipv6_member_t));
- SET_MIB(ip6_mib.ipv6GroupSourceEntrySize, sizeof (ipv6_grpsrc_t));
+ SET_MIB(ip6_mib.ipIfStatsMemberEntrySize, sizeof (ipv6_member_t));
+ SET_MIB(ip6_mib.ipIfStatsGroupSourceEntrySize, sizeof (ipv6_grpsrc_t));
+
+ /*
+ * Synchronize 64- and 32-bit counters
+ */
+ SYNC32_MIB(&ip6_mib, ipIfStatsInReceives, ipIfStatsHCInReceives);
+ SYNC32_MIB(&ip6_mib, ipIfStatsInDelivers, ipIfStatsHCInDelivers);
+ SYNC32_MIB(&ip6_mib, ipIfStatsOutRequests, ipIfStatsHCOutRequests);
+ SYNC32_MIB(&ip6_mib, ipIfStatsOutForwDatagrams,
+ ipIfStatsHCOutForwDatagrams);
+ SYNC32_MIB(&ip6_mib, ipIfStatsOutMcastPkts, ipIfStatsHCOutMcastPkts);
+ SYNC32_MIB(&ip6_mib, ipIfStatsInMcastPkts, ipIfStatsHCInMcastPkts);
+
if (!snmp_append_data2(mpctl->b_cont, &mp_tail, (char *)&ip6_mib,
(int)sizeof (ip6_mib))) {
ip1dbg(("ip_snmp_get_mib2_ip6: failed to allocate %u bytes\n",
@@ -18727,29 +18926,35 @@ ip_snmp_get_mib2_ip6(queue_t *q, mblk_t *mpctl)
rw_enter(&ill_g_lock, RW_READER);
ill = ILL_START_WALK_V6(&ctx);
for (; ill != NULL; ill = ill_next(&ctx, ill)) {
- ill->ill_ip6_mib->ipv6IfIndex =
+ ill->ill_ip_mib->ipIfStatsIfIndex =
ill->ill_phyint->phyint_ifindex;
- SET_MIB(ill->ill_ip6_mib->ipv6Forwarding,
+ SET_MIB(ill->ill_ip_mib->ipIfStatsForwarding,
ipv6_forward ? 1 : 2);
- SET_MIB(ill->ill_ip6_mib->ipv6DefaultHopLimit,
+ SET_MIB(ill->ill_ip_mib->ipIfStatsDefaultHopLimit,
ill->ill_max_hops);
- SET_MIB(ill->ill_ip6_mib->ipv6IfStatsEntrySize,
- sizeof (mib2_ipv6IfStatsEntry_t));
- SET_MIB(ill->ill_ip6_mib->ipv6AddrEntrySize,
- sizeof (mib2_ipv6AddrEntry_t));
- SET_MIB(ill->ill_ip6_mib->ipv6RouteEntrySize,
- sizeof (mib2_ipv6RouteEntry_t));
- SET_MIB(ill->ill_ip6_mib->ipv6NetToMediaEntrySize,
- sizeof (mib2_ipv6NetToMediaEntry_t));
- SET_MIB(ill->ill_ip6_mib->ipv6MemberEntrySize,
- sizeof (ipv6_member_t));
+
+ /*
+ * Synchronize 64- and 32-bit counters
+ */
+ SYNC32_MIB(&ip6_mib, ipIfStatsInReceives,
+ ipIfStatsHCInReceives);
+ SYNC32_MIB(&ip6_mib, ipIfStatsInDelivers,
+ ipIfStatsHCInDelivers);
+ SYNC32_MIB(&ip6_mib, ipIfStatsOutRequests,
+ ipIfStatsHCOutRequests);
+ SYNC32_MIB(&ip6_mib, ipIfStatsOutForwDatagrams,
+ ipIfStatsHCOutForwDatagrams);
+ SYNC32_MIB(&ip6_mib, ipIfStatsOutMcastPkts,
+ ipIfStatsHCOutMcastPkts);
+ SYNC32_MIB(&ip6_mib, ipIfStatsInMcastPkts,
+ ipIfStatsHCInMcastPkts);
if (!snmp_append_data2(mpctl->b_cont, &mp_tail,
- (char *)ill->ill_ip6_mib,
- (int)sizeof (*ill->ill_ip6_mib))) {
+ (char *)ill->ill_ip_mib,
+ (int)sizeof (*ill->ill_ip_mib))) {
ip1dbg(("ip_snmp_get_mib2_ip6: failed to allocate "
"%u bytes\n",
- (uint_t)sizeof (*ill->ill_ip6_mib)));
+ (uint_t)sizeof (*ill->ill_ip_mib)));
}
}
rw_exit(&ill_g_lock);
@@ -18783,7 +18988,7 @@ ip_snmp_get_mib2_icmp6(queue_t *q, mblk_t *mpctl)
optp->level = MIB2_ICMP6;
optp->name = 0;
/* Include "unknown interface" icmp6_mib */
- icmp6_mib.ipv6IfIcmpIfIndex = 0; /* Flag to netstat */
+ icmp6_mib.ipv6IfIcmpIfIndex = MIB2_UNKNOWN_INTERFACE; /* netstat flag */
icmp6_mib.ipv6IfIcmpEntrySize = sizeof (mib2_ipv6IfIcmpEntry_t);
if (!snmp_append_data2(mpctl->b_cont, &mp_tail, (char *)&icmp6_mib,
(int)sizeof (icmp6_mib))) {
@@ -18796,8 +19001,6 @@ ip_snmp_get_mib2_icmp6(queue_t *q, mblk_t *mpctl)
for (; ill != NULL; ill = ill_next(&ctx, ill)) {
ill->ill_icmp6_mib->ipv6IfIcmpIfIndex =
ill->ill_phyint->phyint_ifindex;
- ill->ill_icmp6_mib->ipv6IfIcmpEntrySize =
- sizeof (mib2_ipv6IfIcmpEntry_t);
if (!snmp_append_data2(mpctl->b_cont, &mp_tail,
(char *)ill->ill_icmp6_mib,
(int)sizeof (*ill->ill_icmp6_mib))) {
@@ -19203,6 +19406,136 @@ ip_snmp_set(queue_t *q, int level, int name, uchar_t *ptr, int len)
}
/*
+ * When there exists both a 64- and 32-bit counter of a particular type
+ * (i.e., InReceives), only the 64-bit counters are added.
+ */
+void
+ip_mib2_add_ip_stats(mib2_ipIfStatsEntry_t *o1, mib2_ipIfStatsEntry_t *o2)
+{
+ UPDATE_MIB(o1, ipIfStatsInHdrErrors, o2->ipIfStatsInHdrErrors);
+ UPDATE_MIB(o1, ipIfStatsInTooBigErrors, o2->ipIfStatsInTooBigErrors);
+ UPDATE_MIB(o1, ipIfStatsInNoRoutes, o2->ipIfStatsInNoRoutes);
+ UPDATE_MIB(o1, ipIfStatsInAddrErrors, o2->ipIfStatsInAddrErrors);
+ UPDATE_MIB(o1, ipIfStatsInUnknownProtos, o2->ipIfStatsInUnknownProtos);
+ UPDATE_MIB(o1, ipIfStatsInTruncatedPkts, o2->ipIfStatsInTruncatedPkts);
+ UPDATE_MIB(o1, ipIfStatsInDiscards, o2->ipIfStatsInDiscards);
+ UPDATE_MIB(o1, ipIfStatsOutDiscards, o2->ipIfStatsOutDiscards);
+ UPDATE_MIB(o1, ipIfStatsOutFragOKs, o2->ipIfStatsOutFragOKs);
+ UPDATE_MIB(o1, ipIfStatsOutFragFails, o2->ipIfStatsOutFragFails);
+ UPDATE_MIB(o1, ipIfStatsOutFragCreates, o2->ipIfStatsOutFragCreates);
+ UPDATE_MIB(o1, ipIfStatsReasmReqds, o2->ipIfStatsReasmReqds);
+ UPDATE_MIB(o1, ipIfStatsReasmOKs, o2->ipIfStatsReasmOKs);
+ UPDATE_MIB(o1, ipIfStatsReasmFails, o2->ipIfStatsReasmFails);
+ UPDATE_MIB(o1, ipIfStatsOutNoRoutes, o2->ipIfStatsOutNoRoutes);
+ UPDATE_MIB(o1, ipIfStatsReasmDuplicates, o2->ipIfStatsReasmDuplicates);
+ UPDATE_MIB(o1, ipIfStatsReasmPartDups, o2->ipIfStatsReasmPartDups);
+ UPDATE_MIB(o1, ipIfStatsForwProhibits, o2->ipIfStatsForwProhibits);
+ UPDATE_MIB(o1, udpInCksumErrs, o2->udpInCksumErrs);
+ UPDATE_MIB(o1, udpInOverflows, o2->udpInOverflows);
+ UPDATE_MIB(o1, rawipInOverflows, o2->rawipInOverflows);
+ UPDATE_MIB(o1, ipIfStatsInWrongIPVersion,
+ o2->ipIfStatsInWrongIPVersion);
+ UPDATE_MIB(o1, ipIfStatsOutWrongIPVersion,
+ o2->ipIfStatsInWrongIPVersion);
+ UPDATE_MIB(o1, ipIfStatsOutSwitchIPVersion,
+ o2->ipIfStatsOutSwitchIPVersion);
+ UPDATE_MIB(o1, ipIfStatsHCInReceives, o2->ipIfStatsHCInReceives);
+ UPDATE_MIB(o1, ipIfStatsHCInOctets, o2->ipIfStatsHCInOctets);
+ UPDATE_MIB(o1, ipIfStatsHCInForwDatagrams,
+ o2->ipIfStatsHCInForwDatagrams);
+ UPDATE_MIB(o1, ipIfStatsHCInDelivers, o2->ipIfStatsHCInDelivers);
+ UPDATE_MIB(o1, ipIfStatsHCOutRequests, o2->ipIfStatsHCOutRequests);
+ UPDATE_MIB(o1, ipIfStatsHCOutForwDatagrams,
+ o2->ipIfStatsHCOutForwDatagrams);
+ UPDATE_MIB(o1, ipIfStatsOutFragReqds, o2->ipIfStatsOutFragReqds);
+ UPDATE_MIB(o1, ipIfStatsHCOutTransmits, o2->ipIfStatsHCOutTransmits);
+ UPDATE_MIB(o1, ipIfStatsHCOutOctets, o2->ipIfStatsHCOutOctets);
+ UPDATE_MIB(o1, ipIfStatsHCInMcastPkts, o2->ipIfStatsHCInMcastPkts);
+ UPDATE_MIB(o1, ipIfStatsHCInMcastOctets, o2->ipIfStatsHCInMcastOctets);
+ UPDATE_MIB(o1, ipIfStatsHCOutMcastPkts, o2->ipIfStatsHCOutMcastPkts);
+ UPDATE_MIB(o1, ipIfStatsHCOutMcastOctets,
+ o2->ipIfStatsHCOutMcastOctets);
+ UPDATE_MIB(o1, ipIfStatsHCInBcastPkts, o2->ipIfStatsHCInBcastPkts);
+ UPDATE_MIB(o1, ipIfStatsHCOutBcastPkts, o2->ipIfStatsHCOutBcastPkts);
+ UPDATE_MIB(o1, ipsecInSucceeded, o2->ipsecInSucceeded);
+ UPDATE_MIB(o1, ipsecInFailed, o2->ipsecInFailed);
+ UPDATE_MIB(o1, ipInCksumErrs, o2->ipInCksumErrs);
+ UPDATE_MIB(o1, tcpInErrs, o2->tcpInErrs);
+ UPDATE_MIB(o1, udpNoPorts, o2->udpNoPorts);
+}
+
+void
+ip_mib2_add_icmp6_stats(mib2_ipv6IfIcmpEntry_t *o1, mib2_ipv6IfIcmpEntry_t *o2)
+{
+ UPDATE_MIB(o1, ipv6IfIcmpInMsgs, o2->ipv6IfIcmpInMsgs);
+ UPDATE_MIB(o1, ipv6IfIcmpInErrors, o2->ipv6IfIcmpInErrors);
+ UPDATE_MIB(o1, ipv6IfIcmpInDestUnreachs, o2->ipv6IfIcmpInDestUnreachs);
+ UPDATE_MIB(o1, ipv6IfIcmpInAdminProhibs, o2->ipv6IfIcmpInAdminProhibs);
+ UPDATE_MIB(o1, ipv6IfIcmpInTimeExcds, o2->ipv6IfIcmpInTimeExcds);
+ UPDATE_MIB(o1, ipv6IfIcmpInParmProblems, o2->ipv6IfIcmpInParmProblems);
+ UPDATE_MIB(o1, ipv6IfIcmpInPktTooBigs, o2->ipv6IfIcmpInPktTooBigs);
+ UPDATE_MIB(o1, ipv6IfIcmpInEchos, o2->ipv6IfIcmpInEchos);
+ UPDATE_MIB(o1, ipv6IfIcmpInEchoReplies, o2->ipv6IfIcmpInEchoReplies);
+ UPDATE_MIB(o1, ipv6IfIcmpInRouterSolicits,
+ o2->ipv6IfIcmpInRouterSolicits);
+ UPDATE_MIB(o1, ipv6IfIcmpInRouterAdvertisements,
+ o2->ipv6IfIcmpInRouterAdvertisements);
+ UPDATE_MIB(o1, ipv6IfIcmpInNeighborSolicits,
+ o2->ipv6IfIcmpInNeighborSolicits);
+ UPDATE_MIB(o1, ipv6IfIcmpInNeighborAdvertisements,
+ o2->ipv6IfIcmpInNeighborAdvertisements);
+ UPDATE_MIB(o1, ipv6IfIcmpInRedirects, o2->ipv6IfIcmpInRedirects);
+ UPDATE_MIB(o1, ipv6IfIcmpInGroupMembQueries,
+ o2->ipv6IfIcmpInGroupMembQueries);
+ UPDATE_MIB(o1, ipv6IfIcmpInGroupMembResponses,
+ o2->ipv6IfIcmpInGroupMembResponses);
+ UPDATE_MIB(o1, ipv6IfIcmpInGroupMembReductions,
+ o2->ipv6IfIcmpInGroupMembReductions);
+ UPDATE_MIB(o1, ipv6IfIcmpOutMsgs, o2->ipv6IfIcmpOutMsgs);
+ UPDATE_MIB(o1, ipv6IfIcmpOutErrors, o2->ipv6IfIcmpOutErrors);
+ UPDATE_MIB(o1, ipv6IfIcmpOutDestUnreachs,
+ o2->ipv6IfIcmpOutDestUnreachs);
+ UPDATE_MIB(o1, ipv6IfIcmpOutAdminProhibs,
+ o2->ipv6IfIcmpOutAdminProhibs);
+ UPDATE_MIB(o1, ipv6IfIcmpOutTimeExcds, o2->ipv6IfIcmpOutTimeExcds);
+ UPDATE_MIB(o1, ipv6IfIcmpOutParmProblems,
+ o2->ipv6IfIcmpOutParmProblems);
+ UPDATE_MIB(o1, ipv6IfIcmpOutPktTooBigs, o2->ipv6IfIcmpOutPktTooBigs);
+ UPDATE_MIB(o1, ipv6IfIcmpOutEchos, o2->ipv6IfIcmpOutEchos);
+ UPDATE_MIB(o1, ipv6IfIcmpOutEchoReplies, o2->ipv6IfIcmpOutEchoReplies);
+ UPDATE_MIB(o1, ipv6IfIcmpOutRouterSolicits,
+ o2->ipv6IfIcmpOutRouterSolicits);
+ UPDATE_MIB(o1, ipv6IfIcmpOutRouterAdvertisements,
+ o2->ipv6IfIcmpOutRouterAdvertisements);
+ UPDATE_MIB(o1, ipv6IfIcmpOutNeighborSolicits,
+ o2->ipv6IfIcmpOutNeighborSolicits);
+ UPDATE_MIB(o1, ipv6IfIcmpOutNeighborAdvertisements,
+ o2->ipv6IfIcmpOutNeighborAdvertisements);
+ UPDATE_MIB(o1, ipv6IfIcmpOutRedirects, o2->ipv6IfIcmpOutRedirects);
+ UPDATE_MIB(o1, ipv6IfIcmpOutGroupMembQueries,
+ o2->ipv6IfIcmpOutGroupMembQueries);
+ UPDATE_MIB(o1, ipv6IfIcmpOutGroupMembResponses,
+ o2->ipv6IfIcmpOutGroupMembResponses);
+ UPDATE_MIB(o1, ipv6IfIcmpOutGroupMembReductions,
+ o2->ipv6IfIcmpOutGroupMembReductions);
+ UPDATE_MIB(o1, ipv6IfIcmpInOverflows, o2->ipv6IfIcmpInOverflows);
+ UPDATE_MIB(o1, ipv6IfIcmpBadHoplimit, o2->ipv6IfIcmpBadHoplimit);
+ UPDATE_MIB(o1, ipv6IfIcmpInBadNeighborAdvertisements,
+ o2->ipv6IfIcmpInBadNeighborAdvertisements);
+ UPDATE_MIB(o1, ipv6IfIcmpInBadNeighborSolicitations,
+ o2->ipv6IfIcmpInBadNeighborSolicitations);
+ UPDATE_MIB(o1, ipv6IfIcmpInBadRedirects, o2->ipv6IfIcmpInBadRedirects);
+ UPDATE_MIB(o1, ipv6IfIcmpInGroupMembTotal,
+ o2->ipv6IfIcmpInGroupMembTotal);
+ UPDATE_MIB(o1, ipv6IfIcmpInGroupMembBadQueries,
+ o2->ipv6IfIcmpInGroupMembBadQueries);
+ UPDATE_MIB(o1, ipv6IfIcmpInGroupMembBadReports,
+ o2->ipv6IfIcmpInGroupMembBadReports);
+ UPDATE_MIB(o1, ipv6IfIcmpInGroupMembOurReports,
+ o2->ipv6IfIcmpInGroupMembOurReports);
+}
+
+/*
* Called before the options are updated to check if this packet will
* be source routed from here.
* This routine assumes that the options are well formed i.e. that they
@@ -19610,7 +19943,7 @@ ip_output(void *arg, mblk_t *mp, void *arg2, int caller)
* originating from tcp should have been directed over to
* tcp_multisend() in the first place.
*/
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
freemsg(mp);
return;
} else if (DB_TYPE(mp) != M_DATA)
@@ -19653,7 +19986,7 @@ ip_output(void *arg, mblk_t *mp, void *arg2, int caller)
if (err == EINVAL)
goto icmp_parameter_problem;
ip2dbg(("ip_wput: label check failed (%d)\n", err));
- goto drop_pkt;
+ goto discard_pkt;
}
iplen = ntohs(ipha->ipha_length) + adjust;
ipha->ipha_length = htons(iplen);
@@ -19669,6 +20002,7 @@ ip_output(void *arg, mblk_t *mp, void *arg2, int caller)
if (connp->conn_out_enforce_policy || (connp->conn_latch != NULL)) {
if (((mp = ipsec_attach_ipsec_out(mp, connp, NULL,
ipha->ipha_protocol)) == NULL)) {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
if (need_decref)
CONN_DEC_REF(connp);
return;
@@ -19694,6 +20028,7 @@ ip_output(void *arg, mblk_t *mp, void *arg2, int caller)
attach_ill = conn_get_held_ill(connp,
&connp->conn_nofailover_ill, &err);
if (err == ILL_LOOKUP_FAILED) {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
if (need_decref)
CONN_DEC_REF(connp);
freemsg(first_mp);
@@ -19751,6 +20086,7 @@ ip_output(void *arg, mblk_t *mp, void *arg2, int caller)
xmit_ill = conn_get_held_ill(connp,
&connp->conn_xmit_if_ill, &err);
if (err == ILL_LOOKUP_FAILED) {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
if (attach_ill != NULL)
ill_refrele(attach_ill);
if (need_decref)
@@ -20126,7 +20462,7 @@ qnext:
ifindex));
freemsg(first_mp);
BUMP_MIB(&ip_mib,
- ipOutDiscards);
+ ipIfStatsOutDiscards);
ASSERT(!need_decref);
return;
}
@@ -20149,7 +20485,7 @@ qnext:
"(BIND TO IPIF_NOFAILOVER) %d\n",
ifindex));
freemsg(first_mp);
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
ASSERT(!need_decref);
return;
}
@@ -20172,12 +20508,11 @@ qnext:
(mp->b_wptr - rptr) < IP_SIMPLE_HDR_LENGTH) {
hdrtoosmall:
if (!pullupmsg(mp, IP_SIMPLE_HDR_LENGTH)) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
TRACE_2(TR_FAC_IP, TR_IP_WPUT_END,
"ip_wput_end: q %p (%S)", q, "pullupfailed");
if (first_mp == NULL)
first_mp = mp;
- goto drop_pkt;
+ goto discard_pkt;
}
/* This function assumes that mp points to an IPv4 packet. */
@@ -20196,7 +20531,7 @@ qnext:
goto icmp_parameter_problem;
ip2dbg(("ip_wput: label check failed (%d)\n",
err));
- goto drop_pkt;
+ goto discard_pkt;
}
iplen = ntohs(ipha->ipha_length) + adjust;
ipha->ipha_length = htons(iplen);
@@ -20212,6 +20547,7 @@ qnext:
if (connp->conn_out_enforce_policy) {
if (((mp = ipsec_attach_ipsec_out(mp, connp,
NULL, ipha->ipha_protocol)) == NULL)) {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
if (need_decref)
CONN_DEC_REF(connp);
return;
@@ -20255,7 +20591,7 @@ qnext:
if (q->q_next == NULL) /* Avoid ill queue */
ip_setqinfo(RD(q), B_TRUE, B_TRUE);
#endif
- BUMP_MIB(&ip_mib, ipOutIPv6);
+ BUMP_MIB(&ip_mib, ipIfStatsOutWrongIPVersion);
ASSERT(xmit_ill == NULL);
if (attach_ill != NULL)
ill_refrele(attach_ill);
@@ -20266,10 +20602,9 @@ qnext:
}
if ((v_hlen >> 4) != IP_VERSION) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
TRACE_2(TR_FAC_IP, TR_IP_WPUT_END,
"ip_wput_end: q %p (%S)", q, "badvers");
- goto drop_pkt;
+ goto discard_pkt;
}
/*
* Is the header length at least 20 bytes?
@@ -20280,17 +20615,15 @@ qnext:
v_hlen &= 0xF;
v_hlen <<= 2;
if (v_hlen < IP_SIMPLE_HDR_LENGTH) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
TRACE_2(TR_FAC_IP, TR_IP_WPUT_END,
"ip_wput_end: q %p (%S)", q, "badlen");
- goto drop_pkt;
+ goto discard_pkt;
}
if (v_hlen > (mp->b_wptr - rptr)) {
if (!pullupmsg(mp, v_hlen)) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
TRACE_2(TR_FAC_IP, TR_IP_WPUT_END,
"ip_wput_end: q %p (%S)", q, "badpullup2");
- goto drop_pkt;
+ goto discard_pkt;
}
ipha = (ipha_t *)mp->b_rptr;
}
@@ -20300,6 +20633,7 @@ qnext:
*/
if (ip_wput_options(q, first_mp, ipha, mctl_present, zoneid)) {
ASSERT(xmit_ill == NULL);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
if (attach_ill != NULL)
ill_refrele(attach_ill);
TRACE_2(TR_FAC_IP, TR_IP_WPUT_END,
@@ -20377,6 +20711,7 @@ qnext:
&connp->conn_xmit_if_ill, &err);
if (err == ILL_LOOKUP_FAILED) {
ip1dbg(("ip_wput: No ill for IP_XMIT_IF\n"));
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
goto drop_pkt;
}
if (xmit_ill == NULL) {
@@ -20385,7 +20720,7 @@ qnext:
if (err == IPIF_LOOKUP_FAILED) {
ip1dbg(("ip_wput: No ipif for "
"multicast\n"));
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
goto drop_pkt;
}
}
@@ -20394,7 +20729,7 @@ qnext:
if (ipif == NULL) {
ip1dbg(("ip_wput: No ipif for "
"IP_XMIT_IF\n"));
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
goto drop_pkt;
}
} else if (ipif == NULL || ipif->ipif_isv6) {
@@ -20420,7 +20755,7 @@ qnext:
if (ipif == NULL) {
ip1dbg(("ip_wput: No ipif for "
"multicast\n"));
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
goto drop_pkt;
}
err = conn_set_held_ipif(connp,
@@ -20429,7 +20764,7 @@ qnext:
ipif_refrele(ipif);
ip1dbg(("ip_wput: No ipif for "
"multicast\n"));
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
goto drop_pkt;
}
}
@@ -20452,7 +20787,7 @@ qnext:
BPRI_HI)) == NULL) {
ipif_refrele(ipif);
first_mp = mp;
- goto drop_pkt;
+ goto discard_pkt;
}
first_mp->b_datap->db_type = M_CTL;
first_mp->b_wptr += sizeof (ipsec_info_t);
@@ -20645,7 +20980,7 @@ dontroute:
if (dst_ipif == NULL) {
ip1dbg(("ip_wput: no route for "
"dst using SO_DONTROUTE\n"));
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
mp->b_prev = mp->b_next = NULL;
if (first_mp == NULL)
first_mp = mp;
@@ -20668,7 +21003,7 @@ dontroute:
" dst using"
" SO_DONTROUTE\n"));
BUMP_MIB(&ip_mib,
- ipOutNoRoutes);
+ ipIfStatsOutNoRoutes);
mp->b_prev = mp->b_next = NULL;
if (first_mp == NULL)
first_mp = mp;
@@ -20702,7 +21037,7 @@ send_from_ill:
attach_ipif = ipif_get_next_ipif(NULL, attach_ill);
if (attach_ipif == NULL) {
ip1dbg(("ip_wput: No ipif for attach_ill\n"));
- goto drop_pkt;
+ goto discard_pkt;
}
ire = ire_ctable_lookup(dst, 0, 0, attach_ipif,
zoneid, MBLK_GETLABEL(mp), match_flags);
@@ -20721,6 +21056,7 @@ send_from_ill:
xmit_ill = conn_get_held_ill(connp,
&connp->conn_xmit_if_ill, &err);
if (err == ILL_LOOKUP_FAILED) {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
if (need_decref)
CONN_DEC_REF(connp);
freemsg(first_mp);
@@ -20788,7 +21124,7 @@ send_from_ill:
sizeof (ipsec_info_t), BPRI_HI);
if (first_mp == NULL) {
first_mp = mp;
- goto drop_pkt;
+ goto discard_pkt;
}
first_mp->b_datap->db_type = M_CTL;
first_mp->b_wptr +=
@@ -20921,12 +21257,14 @@ icmp_parameter_problem:
/* could not have originated externally */
ASSERT(mp->b_prev == NULL);
if (ip_hdr_complete(ipha, zoneid) == 0) {
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
/* it's the IP header length that's in trouble */
icmp_param_problem(q, first_mp, 0, zoneid);
first_mp = NULL;
}
+discard_pkt:
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
drop_pkt:
ip1dbg(("ip_wput: dropped packet\n"));
if (ire != NULL)
@@ -21614,7 +21952,7 @@ ip_wput_ire(queue_t *q, mblk_t *mp, ire_t *ire, conn_t *connp, int caller,
ire_refrele(ire);
if (conn_outgoing_ill != NULL)
ill_refrele(conn_outgoing_ill);
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
if (src_ire != NULL) {
if (src_ire->ire_flags & RTF_BLACKHOLE) {
ire_refrele(src_ire);
@@ -21776,7 +22114,12 @@ another:;
if (conn_outgoing_ill != NULL)
ill_refrele(conn_outgoing_ill);
freemsg(first_mp);
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ if (ill != NULL) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
+ }
return;
}
} else {
@@ -21811,7 +22154,7 @@ another:;
/* The ill_index for outbound ILL */
ill_index = Q_TO_INDEX(stq);
- BUMP_MIB(&ip_mib, ipOutRequests);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutRequests);
ttl_protocol = ((uint16_t *)ipha)[4];
/* pseudo checksum (do it in parts for IP header checksum) */
@@ -22024,6 +22367,12 @@ release_ire_and_ill:
return;
}
+ if (CLASSD(dst)) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutMcastPkts);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutMcastOctets,
+ ntohs(ipha->ipha_length));
+ }
+
TRACE_2(TR_FAC_IP, TR_IP_WPUT_IRE_END,
"ip_wput_ire_end: q %p (%S)",
q, "last copy out");
@@ -22042,6 +22391,7 @@ release_ire_and_ill:
next_mp = NULL;
ipha = (ipha_t *)mp->b_rptr;
ill_index = Q_TO_INDEX(stq);
+ ill = (ill_t *)stq->q_ptr;
}
} while (multirt_send);
if (conn_outgoing_ill != NULL)
@@ -22228,8 +22578,9 @@ broadcast:
* A non-NULL send-to queue means this packet is going
* out of this machine.
*/
+ out_ill = (ill_t *)stq->q_ptr;
- BUMP_MIB(&ip_mib, ipOutRequests);
+ BUMP_MIB(out_ill->ill_ip_mib, ipIfStatsHCOutRequests);
ttl_protocol = ((uint16_t *)ipha)[4];
/*
* We accumulate the pseudo header checksum in cksum.
@@ -22313,7 +22664,9 @@ broadcast:
first_mp);
}
} else {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ out_ill = (ill_t *)stq->q_ptr;
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
freemsg(first_mp);
TRACE_2(TR_FAC_IP, TR_IP_WPUT_IRE_END,
"ip_wput_ire_end: q %p (%S)",
@@ -22618,6 +22971,17 @@ release_ire_and_ill_2:
return;
}
+ if (CLASSD(dst)) {
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutMcastPkts);
+ UPDATE_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutMcastOctets,
+ ntohs(ipha->ipha_length));
+ } else if (ire->ire_type == IRE_BROADCAST) {
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutBcastPkts);
+ }
+
if (multirt_send) {
/*
* We are in a multiple send case,
@@ -22665,8 +23029,11 @@ release_ire_and_ill_2:
if (ipsec_len != 0) {
if ((max_frag < (unsigned int)(LENGTH +
ipsec_len)) && (offset & IPH_DF)) {
-
- BUMP_MIB(&ip_mib, ipFragFails);
+ out_ill = (ill_t *)stq->q_ptr;
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutFragFails);
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutFragReqds);
ipha->ipha_hdr_checksum = 0;
ipha->ipha_hdr_checksum =
(uint16_t)ip_csum_hdr(ipha);
@@ -22683,7 +23050,7 @@ release_ire_and_ill_2:
} else {
/*
* This won't cause a icmp_frag_needed
- * message. to be gnerated. Send it on
+ * message. to be generated. Send it on
* the wire. Note that this could still
* cause fragmentation and all we
* do is the generation of the message
@@ -22720,8 +23087,9 @@ release_ire_and_ill_2:
ip_process(IPP_LOCAL_OUT, &mp,
ill_index);
if (mp == NULL) {
- BUMP_MIB(&ip_mib,
- ipOutDiscards);
+ out_ill = (ill_t *)stq->q_ptr;
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
if (next_mp != NULL) {
freemsg(next_mp);
ire_refrele(ire1);
@@ -23218,10 +23586,14 @@ ip_wput_frag_mdt(ire_t *ire, mblk_t *mp, ip_pkt_t pkt_type, int len,
unsigned char *hdr_ptr, *pld_ptr;
multidata_t *mmd;
ip_pdescinfo_t pdi;
+ ill_t *ill;
ASSERT(DB_TYPE(mp) == M_DATA);
ASSERT(MBLKL(mp) > sizeof (ipha_t));
+ ill = ire_to_ill(ire);
+ ASSERT(ill != NULL);
+
ipha_orig = (ipha_t *)mp->b_rptr;
mp->b_rptr += sizeof (ipha_t);
@@ -23251,7 +23623,7 @@ free_mmd: IP_STAT(ip_frag_mdt_discarded);
freemsg(md_mp);
}
IP_STAT(ip_frag_mdt_allocfail);
- UPDATE_MIB(&ip_mib, ipOutDiscards, pkts);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragFails);
return;
}
IP_STAT(ip_frag_mdt_allocd);
@@ -23394,10 +23766,15 @@ free_mmd: IP_STAT(ip_frag_mdt_discarded);
ASSERT(mp->b_wptr == pld_ptr);
/* Update IP statistics */
- UPDATE_MIB(&ip_mib, ipFragCreates, pkts);
- BUMP_MIB(&ip_mib, ipFragOKs);
IP_STAT_UPDATE(ip_frag_mdt_pkt_out, pkts);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsOutFragCreates, pkts);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragOKs);
+
+ len = ntohs(ipha_orig->ipha_length) + (pkts - 1) * IP_SIMPLE_HDR_LENGTH;
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutTransmits, pkts);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutOctets, len);
+
if (pkt_type == OB_PKT) {
ire->ire_ob_pkt_count += pkts;
if (ire->ire_ipif != NULL)
@@ -23410,10 +23787,13 @@ free_mmd: IP_STAT(ip_frag_mdt_discarded);
*/
ire->ire_ib_pkt_count += pkts;
ASSERT(!IRE_IS_LOCAL(ire));
- if (ire->ire_type & IRE_BROADCAST)
+ if (ire->ire_type & IRE_BROADCAST) {
atomic_add_32(&ire->ire_ipif->ipif_ib_pkt_count, pkts);
- else
+ } else {
+ UPDATE_MIB(ill->ill_ip_mib,
+ ipIfStatsHCOutForwDatagrams, pkts);
atomic_add_32(&ire->ire_ipif->ipif_fo_pkt_count, pkts);
+ }
}
ire->ire_last_used_time = lbolt;
/* Send it down */
@@ -23462,6 +23842,12 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
boolean_t multirt_send = B_FALSE;
ire_t *first_ire = NULL;
irb_t *irb = NULL;
+ mib2_ipIfStatsEntry_t *mibptr = NULL;
+
+ ill = ire_to_ill(ire);
+ mibptr = (ill != NULL) ? ill->ill_ip_mib : &ip_mib;
+
+ BUMP_MIB(mibptr, ipIfStatsOutFragReqds);
/*
* IPSEC does not allow hw accelerated packets to be fragmented
@@ -23482,7 +23868,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
(void) ip_xmit_v4(NULL, ire, NULL, B_FALSE);
ip1dbg(("ip_wput_frag: mac address for ire is unresolved"
" - dropping packet\n"));
- BUMP_MIB(&ip_mib, ipFragFails);
+ BUMP_MIB(mibptr, ipIfStatsOutFragFails);
freemsg(mp);
return;
}
@@ -23508,7 +23894,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
*/
offset = ntohs(ipha->ipha_fragment_offset_and_flags);
if (offset & IPH_DF) {
- BUMP_MIB(&ip_mib, ipFragFails);
+ BUMP_MIB(mibptr, ipIfStatsOutFragFails);
/*
* Need to compute hdr checksum if called from ip_wput_ire.
* Note that ip_rput_forward verifies the checksum before
@@ -23534,7 +23920,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
v_hlen_tos_len = ((uint32_t *)ipha)[0];
if (((max_frag - LENGTH) & ~7) < 8) {
/* TODO: notify ulp somehow */
- BUMP_MIB(&ip_mib, ipFragFails);
+ BUMP_MIB(mibptr, ipIfStatsOutFragFails);
freemsg(mp);
TRACE_1(TR_FAC_IP, TR_IP_WPUT_FRAG_END,
"ip_wput_frag_end:(%S)",
@@ -23556,7 +23942,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
ASSERT(!IRE_IS_LOCAL(ire));
if (hdr_len == IP_SIMPLE_HDR_LENGTH && ip_multidata_outbound &&
!(ire->ire_flags & RTF_MULTIRT) && !IPP_ENABLED(IPP_LOCAL_OUT) &&
- (ill = ire_to_ill(ire)) != NULL && ILL_MDT_CAPABLE(ill) &&
+ ill != NULL && ILL_MDT_CAPABLE(ill) &&
IP_CAN_FRAG_MDT(mp, IP_SIMPLE_HDR_LENGTH, len)) {
ASSERT(ill->ill_mdt_capab != NULL);
if (!ill->ill_mdt_capab->ill_mdt_on) {
@@ -23577,7 +23963,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
/* Get a copy of the header for the trailing frags */
hdr_mp = ip_wput_frag_copyhdr((uchar_t *)ipha, hdr_len, offset);
if (!hdr_mp) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutFragFails);
freemsg(mp);
TRACE_1(TR_FAC_IP, TR_IP_WPUT_FRAG_END,
"ip_wput_frag_end:(%S)",
@@ -23611,7 +23997,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
* original IP header.
*/
if (!(mp = ip_carve_mp(&mp_orig, i1))) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutFragFails);
freeb(hdr_mp);
freemsg(mp_orig);
TRACE_1(TR_FAC_IP, TR_IP_WPUT_FRAG_END,
@@ -23772,7 +24158,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
/* Corner case if copyb has failed */
} else if (!(xmit_mp = copyb(ll_hdr_mp))) {
UNLOCK_IRE_FP_MP(ire);
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutFragFails);
freeb(hdr_mp);
freemsg(mp);
freemsg(mp_orig);
@@ -23812,11 +24198,12 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
xmit_mp->b_band = mp->b_band;
}
UNLOCK_IRE_FP_MP(ire);
- q = ire->ire_stq;
- BUMP_MIB(&ip_mib, ipFragCreates);
+ q = ire->ire_stq;
out_ill = (ill_t *)q->q_ptr;
+ BUMP_MIB(out_ill->ill_ip_mib, ipIfStatsOutFragCreates);
+
DTRACE_PROBE4(ip4__physical__out__start,
ill_t *, NULL, ill_t *, out_ill,
ipha_t *, ipha, mblk_t *, xmit_mp);
@@ -23828,12 +24215,19 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
if (xmit_mp != NULL) {
putnext(q, xmit_mp);
+
+ BUMP_MIB(out_ill->ill_ip_mib, ipIfStatsHCOutTransmits);
+ UPDATE_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutOctets, i1);
+
if (pkt_type != OB_PKT) {
/*
- * Update the packet count of trailing
- * RTF_MULTIRT ires.
+ * Update the packet count and MIB stats
+ * of trailing RTF_MULTIRT ires.
*/
UPDATE_OB_PKT_COUNT(ire);
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutFragReqds);
}
}
@@ -23868,6 +24262,8 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
if (pkt_type == OB_PKT) {
UPDATE_OB_PKT_COUNT(ire);
} else {
+ out_ill = (ill_t *)q->q_ptr;
+ BUMP_MIB(out_ill->ill_ip_mib, ipIfStatsHCOutForwDatagrams);
UPDATE_IB_PKT_COUNT(ire);
}
@@ -23973,6 +24369,9 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
if (pkt_type == OB_PKT) {
UPDATE_OB_PKT_COUNT(ire);
} else {
+ out_ill = (ill_t *)q->q_ptr;
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutForwDatagrams);
UPDATE_IB_PKT_COUNT(ire);
}
@@ -24096,11 +24495,12 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
goto drop_pkt;
}
UNLOCK_IRE_FP_MP(ire);
- BUMP_MIB(&ip_mib, ipFragCreates);
mp1 = mp;
out_ill = (ill_t *)q->q_ptr;
+ BUMP_MIB(out_ill->ill_ip_mib, ipIfStatsOutFragCreates);
+
DTRACE_PROBE4(ip4__physical__out__start,
ill_t *, NULL, ill_t *, out_ill,
ipha_t *, ipha, mblk_t *, xmit_mp);
@@ -24120,6 +24520,11 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
if (xmit_mp != NULL) {
putnext(q, xmit_mp);
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutTransmits);
+ UPDATE_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutOctets, ip_len);
+
if (pkt_type != OB_PKT) {
/*
* Update the packet count of trailing
@@ -24132,6 +24537,8 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
/* All done if we just consumed the hdr_mp. */
if (mp == hdr_mp) {
last_frag = B_TRUE;
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutFragOKs);
}
if (multirt_send) {
@@ -24165,7 +24572,6 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
}
if (last_frag) {
- BUMP_MIB(&ip_mib, ipFragOKs);
TRACE_1(TR_FAC_IP, TR_IP_WPUT_FRAG_END,
"ip_wput_frag_end:(%S)",
"consumed hdr_mp");
@@ -24180,7 +24586,7 @@ ip_wput_frag(ire_t *ire, mblk_t *mp_orig, ip_pkt_t pkt_type, uint32_t max_frag,
drop_pkt:
/* Clean up following allocation failure. */
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutFragFails);
freemsg(mp);
if (mp != hdr_mp)
freeb(hdr_mp);
@@ -24480,7 +24886,7 @@ ip_wput_local(queue_t *q, ill_t *ill, ipha_t *ipha, mblk_t *mp, ire_t *ire,
*/
if ((ushort_t)ire_type == IRE_BROADCAST) {
freemsg(first_mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
ip2dbg(("ip_wput_local: discard broadcast\n"));
return;
}
@@ -25237,7 +25643,7 @@ ip_wput_ipsec_out(queue_t *q, mblk_t *ipsec_mp, ipha_t *ipha, ill_t *ill,
if (ipif == NULL) {
ip1dbg(("ip_wput_ipsec_out: No ipif for"
" multicast\n"));
- BUMP_MIB(&ip_mib, ipOutNoRoutes);
+ BUMP_MIB(&ip_mib, ipIfStatsOutNoRoutes);
freemsg(ipsec_mp);
goto done;
}
@@ -25633,7 +26039,8 @@ send:
freeb(ipsec_mp); /* ip_xmit_v4 frees the mp */
drop_pkt:
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(((ill_t *)ire->ire_stq->q_ptr)->ill_ip_mib,
+ ipIfStatsOutDiscards);
if (ire_need_rele)
ire_refrele(ire);
if (ire1 != NULL) {
@@ -25933,7 +26340,7 @@ ipsec_out_process(queue_t *q, mblk_t *ipsec_mp, ire_t *ire, uint_t ill_index)
ip2dbg(("ipsec_out_process: packet dropped "\
"during IPPF processing\n"));
freeb(ipsec_mp);
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
return;
}
}
@@ -25955,9 +26362,9 @@ ipsec_out_process(queue_t *q, mblk_t *ipsec_mp, ire_t *ire, uint_t ill_index)
if (!ipsec_loaded()) {
ipha = (ipha_t *)ipsec_mp->b_cont->b_rptr;
if (IPH_HDR_VERSION(ipha) == IP_VERSION) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
} else {
- BUMP_MIB(&ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutDiscards);
}
ip_drop_packet(ipsec_mp, B_FALSE, NULL, ire,
&ipdrops_ip_ipsec_not_loaded, &ip_dropper);
@@ -26006,7 +26413,11 @@ ipsec_out_process(queue_t *q, mblk_t *ipsec_mp, ire_t *ire, uint_t ill_index)
"ipsec_out_process: "
"Self-Encapsulation failed: Out of memory\n");
freemsg(ipsec_mp);
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ if (ill != NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
+ }
return;
}
inner_mp = ipsec_mp->b_cont;
@@ -26061,7 +26472,11 @@ ipsec_out_process(queue_t *q, mblk_t *ipsec_mp, ire_t *ire, uint_t ill_index)
case IPSEC_STATUS_SUCCESS:
break;
case IPSEC_STATUS_FAILED:
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ if (ill != NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
+ }
/* FALLTHRU */
case IPSEC_STATUS_PENDING:
return;
@@ -26087,7 +26502,11 @@ ipsec_out_process(queue_t *q, mblk_t *ipsec_mp, ire_t *ire, uint_t ill_index)
case IPSEC_STATUS_SUCCESS:
break;
case IPSEC_STATUS_FAILED:
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ if (ill != NULL) {
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
+ } else {
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
+ }
/* FALLTHRU */
case IPSEC_STATUS_PENDING:
if (ill != NULL && ill_need_rele)
@@ -28436,14 +28855,14 @@ ip_kstat_init(void)
ip_named_kstat_t template = {
{ "forwarding", KSTAT_DATA_UINT32, 0 },
{ "defaultTTL", KSTAT_DATA_UINT32, 0 },
- { "inReceives", KSTAT_DATA_UINT32, 0 },
+ { "inReceives", KSTAT_DATA_UINT64, 0 },
{ "inHdrErrors", KSTAT_DATA_UINT32, 0 },
{ "inAddrErrors", KSTAT_DATA_UINT32, 0 },
- { "forwDatagrams", KSTAT_DATA_UINT32, 0 },
+ { "forwDatagrams", KSTAT_DATA_UINT64, 0 },
{ "inUnknownProtos", KSTAT_DATA_UINT32, 0 },
{ "inDiscards", KSTAT_DATA_UINT32, 0 },
- { "inDelivers", KSTAT_DATA_UINT32, 0 },
- { "outRequests", KSTAT_DATA_UINT32, 0 },
+ { "inDelivers", KSTAT_DATA_UINT64, 0 },
+ { "outRequests", KSTAT_DATA_UINT64, 0 },
{ "outDiscards", KSTAT_DATA_UINT32, 0 },
{ "outNoRoutes", KSTAT_DATA_UINT32, 0 },
{ "reasmTimeout", KSTAT_DATA_UINT32, 0 },
@@ -28512,6 +28931,9 @@ static int
ip_kstat_update(kstat_t *kp, int rw)
{
ip_named_kstat_t *ipkp;
+ mib2_ipIfStatsEntry_t ipmib;
+ ill_walk_context_t ctx;
+ ill_t *ill;
if (!kp || !kp->ks_data)
return (EIO);
@@ -28521,42 +28943,49 @@ ip_kstat_update(kstat_t *kp, int rw)
ipkp = (ip_named_kstat_t *)kp->ks_data;
- ipkp->forwarding.value.ui32 = ip_mib.ipForwarding;
- ipkp->defaultTTL.value.ui32 = ip_mib.ipDefaultTTL;
- ipkp->inReceives.value.ui32 = ip_mib.ipInReceives;
- ipkp->inHdrErrors.value.ui32 = ip_mib.ipInHdrErrors;
- ipkp->inAddrErrors.value.ui32 = ip_mib.ipInAddrErrors;
- ipkp->forwDatagrams.value.ui32 = ip_mib.ipForwDatagrams;
- ipkp->inUnknownProtos.value.ui32 = ip_mib.ipInUnknownProtos;
- ipkp->inDiscards.value.ui32 = ip_mib.ipInDiscards;
- ipkp->inDelivers.value.ui32 = ip_mib.ipInDelivers;
- ipkp->outRequests.value.ui32 = ip_mib.ipOutRequests;
- ipkp->outDiscards.value.ui32 = ip_mib.ipOutDiscards;
- ipkp->outNoRoutes.value.ui32 = ip_mib.ipOutNoRoutes;
- ipkp->reasmTimeout.value.ui32 = ip_mib.ipReasmTimeout;
- ipkp->reasmReqds.value.ui32 = ip_mib.ipReasmReqds;
- ipkp->reasmOKs.value.ui32 = ip_mib.ipReasmOKs;
- ipkp->reasmFails.value.ui32 = ip_mib.ipReasmFails;
- ipkp->fragOKs.value.ui32 = ip_mib.ipFragOKs;
- ipkp->fragFails.value.ui32 = ip_mib.ipFragFails;
- ipkp->fragCreates.value.ui32 = ip_mib.ipFragCreates;
-
- ipkp->routingDiscards.value.ui32 = ip_mib.ipRoutingDiscards;
- ipkp->inErrs.value.ui32 = ip_mib.tcpInErrs;
- ipkp->noPorts.value.ui32 = ip_mib.udpNoPorts;
- ipkp->inCksumErrs.value.ui32 = ip_mib.ipInCksumErrs;
- ipkp->reasmDuplicates.value.ui32 = ip_mib.ipReasmDuplicates;
- ipkp->reasmPartDups.value.ui32 = ip_mib.ipReasmPartDups;
- ipkp->forwProhibits.value.ui32 = ip_mib.ipForwProhibits;
- ipkp->udpInCksumErrs.value.ui32 = ip_mib.udpInCksumErrs;
- ipkp->udpInOverflows.value.ui32 = ip_mib.udpInOverflows;
- ipkp->rawipInOverflows.value.ui32 = ip_mib.rawipInOverflows;
- ipkp->ipsecInSucceeded.value.ui32 = ip_mib.ipsecInSucceeded;
- ipkp->ipsecInFailed.value.i32 = ip_mib.ipsecInFailed;
-
- ipkp->inIPv6.value.ui32 = ip_mib.ipInIPv6;
- ipkp->outIPv6.value.ui32 = ip_mib.ipOutIPv6;
- ipkp->outSwitchIPv6.value.ui32 = ip_mib.ipOutSwitchIPv6;
+ bcopy(&ip_mib, &ipmib, sizeof (ipmib));
+ rw_enter(&ill_g_lock, RW_READER);
+ ill = ILL_START_WALK_V4(&ctx);
+ for (; ill != NULL; ill = ill_next(&ctx, ill))
+ ip_mib2_add_ip_stats(&ipmib, ill->ill_ip_mib);
+ rw_exit(&ill_g_lock);
+
+ ipkp->forwarding.value.ui32 = ipmib.ipIfStatsForwarding;
+ ipkp->defaultTTL.value.ui32 = ipmib.ipIfStatsDefaultTTL;
+ ipkp->inReceives.value.ui64 = ipmib.ipIfStatsHCInReceives;
+ ipkp->inHdrErrors.value.ui32 = ipmib.ipIfStatsInHdrErrors;
+ ipkp->inAddrErrors.value.ui32 = ipmib.ipIfStatsInAddrErrors;
+ ipkp->forwDatagrams.value.ui64 = ipmib.ipIfStatsHCOutForwDatagrams;
+ ipkp->inUnknownProtos.value.ui32 = ipmib.ipIfStatsInUnknownProtos;
+ ipkp->inDiscards.value.ui32 = ipmib.ipIfStatsInDiscards;
+ ipkp->inDelivers.value.ui64 = ipmib.ipIfStatsHCInDelivers;
+ ipkp->outRequests.value.ui64 = ipmib.ipIfStatsHCOutRequests;
+ ipkp->outDiscards.value.ui32 = ipmib.ipIfStatsOutDiscards;
+ ipkp->outNoRoutes.value.ui32 = ipmib.ipIfStatsOutNoRoutes;
+ ipkp->reasmTimeout.value.ui32 = ip_g_frag_timeout;
+ ipkp->reasmReqds.value.ui32 = ipmib.ipIfStatsReasmReqds;
+ ipkp->reasmOKs.value.ui32 = ipmib.ipIfStatsReasmOKs;
+ ipkp->reasmFails.value.ui32 = ipmib.ipIfStatsReasmFails;
+ ipkp->fragOKs.value.ui32 = ipmib.ipIfStatsOutFragOKs;
+ ipkp->fragFails.value.ui32 = ipmib.ipIfStatsOutFragFails;
+ ipkp->fragCreates.value.ui32 = ipmib.ipIfStatsOutFragCreates;
+
+ ipkp->routingDiscards.value.ui32 = 0;
+ ipkp->inErrs.value.ui32 = ipmib.tcpIfStatsInErrs;
+ ipkp->noPorts.value.ui32 = ipmib.udpIfStatsNoPorts;
+ ipkp->inCksumErrs.value.ui32 = ipmib.ipIfStatsInCksumErrs;
+ ipkp->reasmDuplicates.value.ui32 = ipmib.ipIfStatsReasmDuplicates;
+ ipkp->reasmPartDups.value.ui32 = ipmib.ipIfStatsReasmPartDups;
+ ipkp->forwProhibits.value.ui32 = ipmib.ipIfStatsForwProhibits;
+ ipkp->udpInCksumErrs.value.ui32 = ipmib.udpIfStatsInCksumErrs;
+ ipkp->udpInOverflows.value.ui32 = ipmib.udpIfStatsInOverflows;
+ ipkp->rawipInOverflows.value.ui32 = ipmib.rawipIfStatsInOverflows;
+ ipkp->ipsecInSucceeded.value.ui32 = ipmib.ipsecIfStatsInSucceeded;
+ ipkp->ipsecInFailed.value.i32 = ipmib.ipsecIfStatsInFailed;
+
+ ipkp->inIPv6.value.ui32 = ipmib.ipIfStatsInWrongIPVersion;
+ ipkp->outIPv6.value.ui32 = ipmib.ipIfStatsOutWrongIPVersion;
+ ipkp->outSwitchIPv6.value.ui32 = ipmib.ipIfStatsOutSwitchIPVersion;
return (0);
}
@@ -28712,7 +29141,7 @@ ip_fanout_sctp_raw(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha, boolean_t isv4,
rq = connp->conn_rq;
if (!canputnext(rq)) {
CONN_DEC_REF(connp);
- BUMP_MIB(&ip_mib, rawipInOverflows);
+ BUMP_MIB(recv_ill->ill_ip_mib, rawipIfStatsInOverflows);
freemsg(first_mp);
return;
}
@@ -28721,6 +29150,7 @@ ip_fanout_sctp_raw(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha, boolean_t isv4,
first_mp = ipsec_check_inbound_policy(first_mp, connp,
(isv4 ? ipha : NULL), ip6h, mctl_present);
if (first_mp == NULL) {
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
return;
}
@@ -28760,13 +29190,15 @@ ip_fanout_sctp_raw(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha, boolean_t isv4,
} else {
mp = ip_add_info_v6(mp, recv_ill, &ip6h->ip6_dst);
if (mp == NULL) {
+ BUMP_MIB(recv_ill->ill_ip_mib,
+ ipIfStatsInDiscards);
CONN_DEC_REF(connp);
return;
}
}
}
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsHCInDelivers);
/*
* We are sending the IPSEC_IN message also up. Refer
* to comments above this function.
@@ -28775,6 +29207,11 @@ ip_fanout_sctp_raw(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha, boolean_t isv4,
CONN_DEC_REF(connp);
}
+#define UPDATE_IP_MIB_OB_COUNTERS(ill, len) \
+{ \
+ BUMP_MIB((ill)->ill_ip_mib, ipIfStatsHCOutTransmits); \
+ UPDATE_MIB((ill)->ill_ip_mib, ipIfStatsHCOutOctets, (len)); \
+}
/*
* This function should be called only if all packet processing
* including fragmentation is complete. Callers of this function
@@ -28807,6 +29244,7 @@ ip_xmit_v4(mblk_t *mp, ire_t *ire, ipsec_out_t *io, boolean_t flow_ctl_enabled)
boolean_t xmit_drop = B_FALSE;
ip_proc_t proc;
ill_t *out_ill;
+ int pkt_len;
arpce = ire->ire_nce;
ASSERT(arpce != NULL);
@@ -28834,6 +29272,8 @@ ip_xmit_v4(mblk_t *mp, ire_t *ire, ipsec_out_t *io, boolean_t flow_ctl_enabled)
nxt_mp = mp->b_next;
mp->b_next = NULL;
+ ASSERT(mp->b_datap->db_type != M_CTL);
+ pkt_len = ntohs(((ipha_t *)mp->b_rptr)->ipha_length);
/*
* This info is needed for IPQOS to do COS marking
* in ip_wput_attach_llhdr->ip_process.
@@ -28848,11 +29288,8 @@ ip_xmit_v4(mblk_t *mp, ire_t *ire, ipsec_out_t *io, boolean_t flow_ctl_enabled)
ill_index);
if (first_mp == NULL) {
xmit_drop = B_TRUE;
- if (proc == IPP_FWD_OUT) {
- BUMP_MIB(&ip_mib, ipInDiscards);
- } else {
- BUMP_MIB(&ip_mib, ipOutDiscards);
- }
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
goto next_mp;
}
/* non-ipsec hw accel case */
@@ -28868,16 +29305,16 @@ ip_xmit_v4(mblk_t *mp, ire_t *ire, ipsec_out_t *io, boolean_t flow_ctl_enabled)
if (flow_ctl_enabled || canputnext(q)) {
if (proc == IPP_FWD_OUT) {
- BUMP_MIB(&ip_mib,
- ipForwDatagrams);
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsHCOutForwDatagrams);
}
+ UPDATE_IP_MIB_OB_COUNTERS(out_ill,
+ pkt_len);
- if (mp == NULL)
- goto next_mp;
putnext(q, first_mp);
} else {
- BUMP_MIB(&ip_mib,
- ipOutDiscards);
+ BUMP_MIB(out_ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
xmit_drop = B_TRUE;
freemsg(first_mp);
}
@@ -28895,8 +29332,9 @@ ip_xmit_v4(mblk_t *mp, ire_t *ire, ipsec_out_t *io, boolean_t flow_ctl_enabled)
xmit_drop = B_TRUE;
freemsg(mp);
} else {
- ipsec_hw_putnext(ire->ire_stq,
- mp);
+ UPDATE_IP_MIB_OB_COUNTERS(ill1,
+ pkt_len);
+ ipsec_hw_putnext(ire->ire_stq, mp);
}
}
next_mp:
@@ -28947,6 +29385,8 @@ next_mp:
}
}
+#undef UPDATE_IP_MIB_OB_COUNTERS
+
/*
* Return B_TRUE if the buffers differ in length or content.
* This is used for comparing extension header buffers.
diff --git a/usr/src/uts/common/inet/ip/ip6.c b/usr/src/uts/common/inet/ip/ip6.c
index fbcfcae3bd..2ceecd4ac3 100644
--- a/usr/src/uts/common/inet/ip/ip6.c
+++ b/usr/src/uts/common/inet/ip/ip6.c
@@ -183,7 +183,7 @@ static kstat_t *ip6_kstat;
* IPv6 mibs when the interface (ill) is not known.
* When the ill is known the per-interface mib in the ill is used.
*/
-mib2_ipv6IfStatsEntry_t ip6_mib;
+mib2_ipIfStatsEntry_t ip6_mib;
mib2_ipv6IfIcmpEntry_t icmp6_mib;
/*
@@ -445,7 +445,8 @@ icmp_inbound_v6(queue_t *q, mblk_t *mp, ill_t *ill, uint_t hdr_length,
mp1 = copymsg(mp);
freemsg(mp);
if (mp1 == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_icmp6_mib,
+ ipv6IfIcmpInErrors);
if (mctl_present)
freeb(first_mp);
return;
@@ -572,7 +573,7 @@ icmp_inbound_v6(queue_t *q, mblk_t *mp, ill_t *ill, uint_t hdr_length,
*/
ASSERT(first_mp == mp);
if ((first_mp = ipsec_in_alloc(B_FALSE)) == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -585,7 +586,7 @@ icmp_inbound_v6(queue_t *q, mblk_t *mp, ill_t *ill, uint_t hdr_length,
ii->ipsec_in_zoneid = zoneid;
ASSERT(zoneid != ALL_ZONES);
if (!ipsec_in_to_out(first_mp, NULL, ip6h)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return;
}
put(WR(q), first_mp);
@@ -700,7 +701,7 @@ icmp_inbound_too_big_v6(queue_t *q, mblk_t *mp, ill_t *ill,
mp1 = copymsg(mp);
freemsg(mp);
if (mp1 == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
if (mctl_present)
freeb(first_mp);
return;
@@ -722,7 +723,7 @@ icmp_inbound_too_big_v6(queue_t *q, mblk_t *mp, ill_t *ill,
inner_ip6h = (ip6_t *)&icmp6[1]; /* Packet in error */
if ((uchar_t *)&inner_ip6h[1] > mp->b_wptr) {
if (!pullupmsg(mp, (uchar_t *)&inner_ip6h[1] - mp->b_rptr)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -1060,9 +1061,10 @@ icmp_inbound_error_fanout_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h,
*/
ASSERT(first_mp == mp);
first_mp = ipsec_in_alloc(B_FALSE);
+ ASSERT(ill != NULL);
if (first_mp == NULL) {
freemsg(mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return;
}
ii = (ipsec_in_t *)first_mp->b_rptr;
@@ -1071,7 +1073,6 @@ icmp_inbound_error_fanout_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h,
ii->ipsec_in_secure = B_FALSE;
first_mp->b_cont = mp;
mp->b_datap->db_type = M_CTL;
- ASSERT(ill != NULL);
ii->ipsec_in_ill_index =
ill->ill_phyint->phyint_ifindex;
ii->ipsec_in_rill_index = ii->ipsec_in_ill_index;
@@ -1555,7 +1556,7 @@ icmp_pick_source_v6(queue_t *wq, in6_addr_t *origsrc, in6_addr_t *origdst,
NULL, NULL, zoneid, NULL,
(MATCH_IRE_DEFAULT|MATCH_IRE_RECURSIVE));
if (ire == NULL) {
- BUMP_MIB(&ip6_mib, ipv6OutNoRoutes);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutNoRoutes);
return (NULL);
}
/*
@@ -1581,7 +1582,7 @@ icmp_pick_source_v6(queue_t *wq, in6_addr_t *origsrc, in6_addr_t *origdst,
NULL, NULL, zoneid, NULL,
(MATCH_IRE_DEFAULT|MATCH_IRE_RECURSIVE));
if (ire == NULL) {
- BUMP_MIB(&ip6_mib, ipv6OutNoRoutes);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutNoRoutes);
return (NULL);
}
ASSERT(ire != NULL);
@@ -1654,7 +1655,7 @@ icmp_pkt_v6(queue_t *q, mblk_t *mp, void *stuff, size_t len,
* Convert the IPSEC_IN to IPSEC_OUT.
*/
if (!ipsec_in_to_out(ipsec_mp, NULL, ip6h)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
ill_refrele(ill);
return;
}
@@ -1676,7 +1677,7 @@ icmp_pkt_v6(queue_t *q, mblk_t *mp, void *stuff, size_t len,
ASSERT(mp->b_datap->db_type == M_DATA);
if ((ipsec_mp = ipsec_in_alloc(B_FALSE)) == NULL) {
freemsg(mp);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
ill_refrele(ill);
return;
}
@@ -1698,7 +1699,7 @@ icmp_pkt_v6(queue_t *q, mblk_t *mp, void *stuff, size_t len,
* Convert the IPSEC_IN to IPSEC_OUT.
*/
if (!ipsec_in_to_out(ipsec_mp, NULL, ip6h)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
ill_refrele(ill);
return;
}
@@ -3275,7 +3276,7 @@ ip_fanout_proto_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill,
if (ip_fanout_send_icmp_v6(q, first_mp, flags,
ICMP6_PARAM_PROB, ICMP6_PARAMPROB_NEXTHEADER,
nexthdr_offset, mctl_present, zoneid)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InUnknownProtos);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInUnknownProtos);
}
return;
@@ -3339,10 +3340,11 @@ ip_fanout_proto_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill,
mp1 = ip_add_info_v6(mp1, inill, &dst);
}
if (mp1 == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
} else if (!canputnext(rq)) {
if (flags & IP_FF_RAWIP) {
- BUMP_MIB(ill->ill_ip6_mib, rawipInOverflows);
+ BUMP_MIB(ill->ill_ip_mib,
+ rawipIfStatsInOverflows);
} else {
BUMP_MIB(ill->ill_icmp6_mib,
ipv6IfIcmpInOverflows);
@@ -3363,7 +3365,8 @@ ip_fanout_proto_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill,
if (first_mp1 != NULL) {
if (mctl_present)
freeb(first_mp1);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsHCInDelivers);
putnext(rq, mp1);
}
}
@@ -3402,7 +3405,7 @@ ip_fanout_proto_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill,
/* Add header */
mp = ip_add_info_v6(mp, inill, &dst);
if (mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
if (mctl_present)
freeb(first_mp);
@@ -3417,7 +3420,7 @@ ip_fanout_proto_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill,
rq = connp->conn_rq;
if (!canputnext(rq)) {
if (flags & IP_FF_RAWIP) {
- BUMP_MIB(ill->ill_ip6_mib, rawipInOverflows);
+ BUMP_MIB(ill->ill_ip_mib, rawipIfStatsInOverflows);
} else {
BUMP_MIB(ill->ill_icmp6_mib, ipv6IfIcmpInOverflows);
}
@@ -3449,7 +3452,7 @@ ip_fanout_proto_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill,
return;
}
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
putnext(rq, mp);
if (mctl_present)
freeb(first_mp);
@@ -3585,7 +3588,7 @@ ip_fanout_tcp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill, ill_t *inill,
return;
}
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
tcp_xmit_listeners_reset(first_mp, hdr_len, zoneid);
if (connp != NULL)
CONN_DEC_REF(connp);
@@ -3712,7 +3715,7 @@ ip_fanout_tcp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill, ill_t *inill,
/* Add header */
mp = ip_add_info_v6(mp, inill, &ip6h->ip6_dst);
if (mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
if (mctl_present)
freeb(first_mp);
@@ -3725,7 +3728,7 @@ ip_fanout_tcp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, ill_t *ill, ill_t *inill,
}
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
if (IPCL_IS_TCP(connp)) {
(*ip_input_proc)(connp->conn_sqp, first_mp,
connp->conn_recv, connp, SQTAG_IP6_TCP_INPUT);
@@ -3860,7 +3863,7 @@ ip_fanout_udp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, uint32_t ports,
/* Add header */
mp = ip_add_info_v6(mp, inill, &dst);
if (mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
if (mctl_present)
freeb(first_mp);
@@ -3871,7 +3874,7 @@ ip_fanout_udp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, uint32_t ports,
first_mp = mp;
}
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
/* Send it upstream */
CONN_UDP_RECV(connp, mp);
@@ -3949,11 +3952,11 @@ ip_fanout_udp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, uint32_t ports,
if (mp1 == NULL) {
if (mctl_present)
freeb(first_mp1);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto next_one;
}
if (CONN_UDP_FLOWCTLD(connp)) {
- BUMP_MIB(ill->ill_ip6_mib, udpInOverflows);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsInOverflows);
freemsg(first_mp1);
goto next_one;
}
@@ -3967,7 +3970,7 @@ ip_fanout_udp_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h, uint32_t ports,
if (first_mp1 != NULL) {
if (mctl_present)
freeb(first_mp1);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
/* Send it upstream */
CONN_UDP_RECV(connp, mp1);
@@ -4010,7 +4013,7 @@ next_one:
/* Add header */
mp = ip_add_info_v6(mp, inill, &dst);
if (mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
if (mctl_present)
freeb(first_mp);
@@ -4022,19 +4025,19 @@ next_one:
}
}
if (CONN_UDP_FLOWCTLD(connp)) {
- BUMP_MIB(ill->ill_ip6_mib, udpInOverflows);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsInOverflows);
freemsg(mp);
} else {
if (CONN_INBOUND_POLICY_PRESENT_V6(connp) || secure) {
first_mp = ipsec_check_inbound_policy(first_mp,
connp, NULL, ip6h, mctl_present);
if (first_mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
return;
}
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
/* Send it upstream */
CONN_UDP_RECV(connp, mp);
@@ -4060,7 +4063,7 @@ notfound:
if (ip_fanout_send_icmp_v6(q, first_mp, flags,
ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0,
mctl_present, zoneid)) {
- BUMP_MIB(&ip_mib, udpNoPorts);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsNoPorts);
}
}
}
@@ -5622,18 +5625,18 @@ err_ret:
}
if (ill != NULL) {
if (mp->b_prev != NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
} else {
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
}
if (need_rele)
ill_refrele(ill);
} else {
if (mp->b_prev != NULL) {
- BUMP_MIB(&ip6_mib, ipv6InDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsInDiscards);
} else {
- BUMP_MIB(&ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutDiscards);
}
}
/* Did this packet originate externally? */
@@ -5687,18 +5690,18 @@ icmp_err_ret:
/* Did this packet originate externally? */
if (mp->b_prev) {
if (ill != NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InNoRoutes);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInNoRoutes);
} else {
- BUMP_MIB(&ip6_mib, ipv6InNoRoutes);
+ BUMP_MIB(&ip6_mib, ipIfStatsInNoRoutes);
}
mp->b_next = NULL;
mp->b_prev = NULL;
q = WR(q);
} else {
if (ill != NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutNoRoutes);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutNoRoutes);
} else {
- BUMP_MIB(&ip6_mib, ipv6OutNoRoutes);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutNoRoutes);
}
if (ip_hdr_complete_v6(ip6h, zoneid)) {
/* Failed */
@@ -6394,9 +6397,9 @@ err_ret:
ill_held = B_TRUE;
}
if (mp->b_prev || mp->b_next) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
} else {
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
}
ip1dbg(("ip_newroute_ipif_v6: dropped\n"));
mp->b_next = NULL;
@@ -6653,8 +6656,8 @@ ip_process_rthdr(queue_t *q, mblk_t *mp, ip6_t *ip6h, ip6_rthdr_t *rth,
if (!ipv6_forward_src_routed) {
/* XXX Check for source routed out same interface? */
- BUMP_MIB(ill->ill_ip6_mib, ipv6ForwProhibits);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InAddrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInAddrErrors);
freemsg(hada_mp);
freemsg(mp);
return;
@@ -6702,7 +6705,7 @@ ip_process_rthdr(queue_t *q, mblk_t *mp, ip6_t *ip6h, ip6_rthdr_t *rth,
addrptr += (numaddr - rthdr->ip6r0_segleft);
if (IN6_IS_ADDR_MULTICAST(&ip6h->ip6_dst) ||
IN6_IS_ADDR_MULTICAST(addrptr)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(hada_mp);
freemsg(mp);
return;
@@ -6907,8 +6910,9 @@ ip_rput_v6(queue_t *q, mblk_t *mp)
putnext(q, mp);
return;
}
-
- BUMP_MIB(ill->ill_ip6_mib, ipv6InReceives);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInReceives);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCInOctets,
+ (mp->b_cont == NULL) ? MBLKL(mp) : msgdsize(mp));
/*
* if db_ref > 1 then copymsg and free original. Packet may be
* changed and do not want other entity who has a reference to this
@@ -6974,7 +6978,7 @@ ip_rput_v6(queue_t *q, mblk_t *mp)
flags |= (ll_multicast ? IP6_IN_LLMCAST : 0);
ip_rput_data_v6(q, ill, mp, ip6h, flags, hada_mp, dl_mp);
} else {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InIPv4);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInWrongIPVersion);
goto discard;
}
freemsg(dl_mp);
@@ -6984,7 +6988,7 @@ discard:
if (dl_mp != NULL)
freeb(dl_mp);
freemsg(first_mp);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
}
/*
@@ -7107,7 +7111,7 @@ ipsec_early_ah_v6(queue_t *q, mblk_t *first_mp, boolean_t mctl_present,
switch (ipsec_needs_processing_v6(
(mctl_present ? first_mp->b_cont : first_mp), &nexthdr)) {
case IPSEC_MEMORY_ERROR:
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(hada_mp);
freemsg(first_mp);
return (B_TRUE);
@@ -7122,7 +7126,7 @@ ipsec_early_ah_v6(queue_t *q, mblk_t *first_mp, boolean_t mctl_present,
if ((first_mp = ipsec_in_alloc(B_FALSE)) == NULL) {
ip1dbg(("ipsec_early_ah_v6: IPSEC_IN "
"allocation failure.\n"));
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(hada_mp);
freemsg(mp);
return (B_TRUE);
@@ -7165,7 +7169,7 @@ ipsec_early_ah_v6(queue_t *q, mblk_t *first_mp, boolean_t mctl_present,
ip_fanout_proto_again(first_mp, ill, ill, ire);
break;
case IPSEC_STATUS_FAILED:
- BUMP_MIB(&ip6_mib, ipv6InDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsInDiscards);
break;
case IPSEC_STATUS_PENDING:
/* no action needed */
@@ -7187,7 +7191,7 @@ ip_check_v6_mblk(mblk_t *mp, ill_t *ill)
if (!OK_32PTR((uchar_t *)ip6h) ||
(mp->b_wptr - (uchar_t *)ip6h) < IPV6_HDR_LEN) {
if (!pullupmsg(mp, IPV6_HDR_LEN)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
ip1dbg(("ip_rput_v6: pullupmsg failed\n"));
freemsg(mp);
return (-1);
@@ -7214,7 +7218,7 @@ ip_check_v6_mblk(mblk_t *mp, ill_t *ill)
if (ip6_len > pkt_len) {
ip1dbg(("ip_rput_data_v6: packet too short %d %d\n",
ip6_len, pkt_len));
- BUMP_MIB(ill->ill_ip6_mib, ipv6InTruncatedPkts);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInTruncatedPkts);
freemsg(mp);
return (-1);
}
@@ -7222,7 +7226,7 @@ ip_check_v6_mblk(mblk_t *mp, ill_t *ill)
if (!adjmsg(mp, -diff)) {
ip1dbg(("ip_rput_data_v6: adjmsg failed\n"));
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
return (-1);
}
@@ -7326,7 +7330,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
if (mp->b_cont != NULL &&
whereptr + MIN_EHDR_LEN > mp->b_wptr) {
if (!pullupmsg(mp, IPV6_HDR_LEN + MIN_EHDR_LEN)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(hada_mp);
freemsg(first_mp);
return;
@@ -7344,7 +7348,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
if (mp->b_cont != NULL &&
whereptr + ehdrlen > mp->b_wptr) {
if (!pullupmsg(mp, IPV6_HDR_LEN + ehdrlen)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(hada_mp);
freemsg(first_mp);
return;
@@ -7364,7 +7368,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
* Packet has been consumed and any
* needed ICMP messages sent.
*/
- BUMP_MIB(ill->ill_ip6_mib, ipv6InHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
freemsg(hada_mp);
return;
case 0:
@@ -7382,7 +7386,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
if (is_system_labeled() && !tsol_get_pkt_label(mp, IPV6_VERSION)) {
if (ip6opt_ls != 0)
ip0dbg(("tsol_get_pkt_label v6 failed\n"));
- BUMP_MIB(ill->ill_ip6_mib, ipv6InHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
freemsg(hada_mp);
freemsg(first_mp);
return;
@@ -7397,7 +7401,8 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
* much cleaner I think. See ip_rput for how that was done.
*/
if (IN6_IS_ADDR_MULTICAST(&ip6h->ip6_dst)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InMcastPkts);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInMcastPkts);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCInMcastOctets, pkt_len);
/*
* XXX TODO Give to mrouted to for multicast forwarding.
*/
@@ -7411,7 +7416,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
" which is not for us: %s\n", AF_INET6,
&ip6h->ip6_dst);
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(hada_mp);
freemsg(first_mp);
return;
@@ -7446,7 +7451,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
"addressed packet which is not for us: "
"%s\n", AF_INET6, &ip6h->ip6_dst);
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -7471,9 +7476,11 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
* originated externally.
*/
if (!(ill->ill_flags & ILLF_ROUTER) || ll_multicast) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6ForwProhibits);
- if (!(ill->ill_flags & ILLF_ROUTER))
- BUMP_MIB(ill->ill_ip6_mib, ipv6InAddrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
+ if (!(ill->ill_flags & ILLF_ROUTER)) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInAddrErrors);
+ }
freemsg(hada_mp);
freemsg(first_mp);
return;
@@ -7492,7 +7499,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
* an unspecified source address.
*/
if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->ip6_src)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6ForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
freemsg(hada_mp);
freemsg(first_mp);
return;
@@ -7531,13 +7538,21 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
*/
if (no_forward || ll_multicast || (hada_mp != NULL)) {
freemsg(hada_mp);
- BUMP_MIB(ill->ill_ip6_mib, ipv6ForwProhibits);
- if (no_forward)
- BUMP_MIB(ill->ill_ip6_mib, ipv6InAddrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
+ if (no_forward) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInAddrErrors);
+ }
freemsg(mp);
ire_refrele(ire);
return;
}
+ /*
+ * ipIfStatsHCInForwDatagrams should only be increment if there
+ * will be an attempt to forward the packet, which is why we
+ * increment after the above condition has been checked.
+ */
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInForwDatagrams);
if (ip6h->ip6_hops <= 1) {
ip1dbg(("ip_rput_data_v6: hop limit expired.\n"));
/* Sent by forwarding path, and router is global zone */
@@ -7552,7 +7567,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
* an unspecified source address.
*/
if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->ip6_src)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6ForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
freemsg(mp);
ire_refrele(ire);
return;
@@ -7562,7 +7577,8 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
mblk_t *mp1;
if ((mp1 = tsol_ip_forward(ire, mp)) == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6ForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsForwProhibits);
freemsg(mp);
ire_refrele(ire);
return;
@@ -7574,7 +7590,7 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
}
if (pkt_len > ire->ire_max_frag) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InTooBigErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInTooBigErrors);
/* Sent by forwarding path, and router is global zone */
icmp_pkt2big_v6(WR(q), mp, ire->ire_max_frag,
ll_multicast, B_TRUE, GLOBAL_ZONEID);
@@ -7597,7 +7613,8 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
ill_group != ire_group)) {
if (IN6_IS_ADDR_LINKLOCAL(&ip6h->ip6_dst) ||
IN6_IS_ADDR_LINKLOCAL(&ip6h->ip6_src)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InAddrErrors);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInAddrErrors);
freemsg(mp);
ire_refrele(ire);
return;
@@ -7626,8 +7643,8 @@ ip_rput_data_v6(queue_t *q, ill_t *inill, mblk_t *mp, ip6_t *ip6h,
* address, but will forward.
*/
if (!IN6_IS_ADDR_LINKLOCAL(v6targ)) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InAddrErrors);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInAddrErrors);
goto forward;
}
} else {
@@ -7671,7 +7688,7 @@ forward:
if (mp != NULL) {
UPDATE_IB_PKT_COUNT(ire);
ire->ire_last_used_time = lbolt;
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutForwDatagrams);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutForwDatagrams);
ip_xmit_v6(mp, ire, 0, NULL, B_FALSE, NULL);
}
IRE_REFRELE(ire);
@@ -7735,7 +7752,7 @@ forward:
* load spreading, we won't drop packets when we
* are doing strict multihoming checks.
*/
- BUMP_MIB(ill->ill_ip6_mib, ipv6ForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsForwProhibits);
freemsg(hada_mp);
freemsg(first_mp);
ire_refrele(ire);
@@ -7781,8 +7798,8 @@ ipv6forus:
whereptr + TCP_MIN_HEADER_LENGTH > mp->b_wptr) {
if (!pullupmsg(mp,
hdr_len + TCP_MIN_HEADER_LENGTH)) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -7798,8 +7815,8 @@ ipv6forus:
if (offset < 5) {
ip1dbg(("ip_rput_data_v6: short "
"TCP data offset"));
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -7814,8 +7831,8 @@ ipv6forus:
whereptr + offset > mp->b_wptr) {
if (!pullupmsg(mp,
hdr_len + offset)) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -7854,7 +7871,7 @@ ipv6forus:
mp, mp1, cksum_err);
if (cksum_err) {
- BUMP_MIB(&ip_mib, tcpInErrs);
+ BUMP_MIB(ill->ill_ip_mib, tcpIfStatsInErrs);
if (hck_flags & HCK_FULLCKSUM)
IP6_STAT(ip6_tcp_in_full_hw_cksum_err);
@@ -7885,8 +7902,8 @@ tcp_fanout:
if (whereptr + sizeof (*sctph) > mp->b_wptr) {
ASSERT(mp->b_cont != NULL);
if (!pullupmsg(mp, hdr_len + sizeof (*sctph))) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -7915,7 +7932,7 @@ tcp_fanout:
B_TRUE, ipif_id, zoneid);
return;
}
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
sctp_input(connp, (ipha_t *)ip6h, mp, first_mp, ill,
B_FALSE, mctl_present);
return;
@@ -7937,8 +7954,8 @@ tcp_fanout:
if (mp->b_cont != NULL &&
whereptr + UDPH_SIZE > mp->b_wptr) {
if (!pullupmsg(mp, hdr_len + UDPH_SIZE)) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -7963,7 +7980,8 @@ tcp_fanout:
/* 0x0000 checksum is invalid */
ip1dbg(("ip_rput_data_v6: Invalid UDP "
"checksum value 0x0000\n"));
- BUMP_MIB(ill->ill_ip6_mib, udpInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib,
+ udpIfStatsInCksumErrs);
freemsg(first_mp);
return;
}
@@ -8007,7 +8025,8 @@ tcp_fanout:
IP6_STAT(ip6_in_sw_cksum);
if (cksum_err) {
- BUMP_MIB(ill->ill_ip6_mib, udpInCksumErrs);
+ BUMP_MIB(ill->ill_ip_mib,
+ udpIfStatsInCksumErrs);
if (hck_flags & HCK_FULLCKSUM)
IP6_STAT(ip6_udp_in_full_hw_cksum_err);
@@ -8181,7 +8200,7 @@ tcp_fanout:
* Packet has been consumed and any needed
* ICMP errors sent.
*/
- BUMP_MIB(ill->ill_ip6_mib, ipv6InHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
freemsg(hada_mp);
return;
case 0:
@@ -8199,7 +8218,7 @@ tcp_fanout:
#else
freemsg(hada_mp);
freemsg(first_mp);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
return;
#endif
}
@@ -8223,8 +8242,8 @@ tcp_fanout:
whereptr + sizeof (ip6_frag_t) > mp->b_wptr) {
if (!pullupmsg(mp,
pkt_len - remlen + sizeof (ip6_frag_t))) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -8235,7 +8254,7 @@ tcp_fanout:
fraghdr = (ip6_frag_t *)whereptr;
used = (uint_t)sizeof (ip6_frag_t);
- BUMP_MIB(ill->ill_ip6_mib, ipv6ReasmReqds);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmReqds);
/*
* Invoke the CGTP (multirouting) filtering module to
@@ -8265,7 +8284,7 @@ tcp_fanout:
return;
}
/* The first mblk are the headers before the frag hdr */
- BUMP_MIB(ill->ill_ip6_mib, ipv6ReasmOKs);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmOKs);
first_mp = mp; /* mp has most likely changed! */
no_frag_hdr_len = mp->b_wptr - mp->b_rptr;
@@ -8326,8 +8345,8 @@ tcp_fanout:
if (rthdr->ip6r_segleft != 0) {
/* Not end of source route */
if (ll_multicast) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6ForwProhibits);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsForwProhibits);
freemsg(hada_mp);
freemsg(mp);
return;
@@ -8357,8 +8376,8 @@ tcp_fanout:
NULL) {
ip1dbg(("ip_rput_data_v6: IPSEC_IN "
"allocation failure.\n"));
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(mp);
return;
}
@@ -8418,7 +8437,7 @@ tcp_fanout:
case IPSEC_STATUS_SUCCESS:
break;
case IPSEC_STATUS_FAILED:
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
/* FALLTHRU */
case IPSEC_STATUS_PENDING:
return;
@@ -8431,7 +8450,7 @@ tcp_fanout:
/* All processing is done. Count as "delivered". */
freemsg(hada_mp);
freemsg(first_mp);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
return;
}
whereptr += used;
@@ -8443,7 +8462,7 @@ tcp_fanout:
pkt_too_short:
ip1dbg(("ip_rput_data_v6: packet too short %d %lu %d\n",
ip6_len, pkt_len, remlen));
- BUMP_MIB(ill->ill_ip6_mib, ipv6InTruncatedPkts);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInTruncatedPkts);
freemsg(hada_mp);
freemsg(first_mp);
return;
@@ -8472,7 +8491,7 @@ udp_fanout:
if (CONN_UDP_FLOWCTLD(connp)) {
freemsg(first_mp);
- BUMP_MIB(ill->ill_ip6_mib, udpInOverflows);
+ BUMP_MIB(ill->ill_ip_mib, udpIfStatsInOverflows);
CONN_DEC_REF(connp);
return;
}
@@ -8481,7 +8500,7 @@ udp_fanout:
if (IP6_IN_IPP(flags)) {
ip_process(IPP_LOCAL_IN, &mp, ill->ill_phyint->phyint_ifindex);
if (mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
return;
}
@@ -8491,15 +8510,14 @@ udp_fanout:
IN6_IS_ADDR_LINKLOCAL(&ip6h->ip6_src)) {
mp = ip_add_info_v6(mp, inill, &ip6h->ip6_dst);
if (mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
CONN_DEC_REF(connp);
return;
}
}
IP6_STAT(ip6_udp_fast_path);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InReceives);
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDelivers);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCInDelivers);
/* Send it upstream */
CONN_UDP_RECV(connp, mp);
@@ -8620,7 +8638,7 @@ ip_rput_frag_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h,
if (more_frags && (ntohs(ip6h->ip6_plen) & 7)) {
zoneid_t zoneid;
- BUMP_MIB(ill->ill_ip6_mib, ipv6InHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
zoneid = ipif_lookup_addr_zoneid_v6(&ip6h->ip6_dst, ill);
if (zoneid == ALL_ZONES) {
freemsg(mp);
@@ -8646,7 +8664,7 @@ ip_rput_frag_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h,
if (end > IP_MAXPACKET) {
zoneid_t zoneid;
- BUMP_MIB(ill->ill_ip6_mib, ipv6InHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
zoneid = ipif_lookup_addr_zoneid_v6(&ip6h->ip6_dst, ill);
if (zoneid == ALL_ZONES) {
freemsg(mp);
@@ -8766,7 +8784,7 @@ ip_rput_frag_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h,
/* New guy. Allocate a frag message. */
mp1 = allocb(sizeof (*ipf), BPRI_MED);
if (!mp1) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(mp);
partial_reass_done:
mutex_exit(&ipfb->ipfb_lock);
@@ -9011,7 +9029,7 @@ ip_rput_frag_v6(queue_t *q, mblk_t *mp, ip6_t *ip6h,
*/
reass_done:
if (hdr_length < sizeof (ip6_frag_t)) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InHdrErrors);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInHdrErrors);
ip1dbg(("ip_rput_frag_v6: bad packet\n"));
freemsg(mp);
return (NULL);
@@ -9035,7 +9053,7 @@ reass_done:
mblk_t *nmp;
if (!(nmp = dupb(mp))) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
ip1dbg(("ip_rput_frag_v6: dupb failed\n"));
freemsg(mp);
return (NULL);
@@ -9283,7 +9301,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
/* Otherwise contains insert offset for checksum */
int unspec_src;
boolean_t do_outrequests; /* Increment OutRequests? */
- mib2_ipv6IfStatsEntry_t *mibptr;
+ mib2_ipIfStatsEntry_t *mibptr;
int match_flags = MATCH_IRE_ILL_GROUP;
boolean_t attach_if = B_FALSE;
mblk_t *first_mp;
@@ -9346,7 +9364,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
* originating from tcp should have been directed over to
* tcp_multisend() in the first place.
*/
- BUMP_MIB(&ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutDiscards);
freemsg(mp);
return;
} else if (DB_TYPE(mp) == M_CTL) {
@@ -9439,15 +9457,11 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
}
ill_refhold_locked(ill);
mutex_exit(&ill->ill_lock);
- mibptr = ill->ill_ip6_mib;
- /*
- * ill_ip6_mib is allocated by ipif_set_values() when
- * ill_isv6 is set. Thus if ill_isv6 is true,
- * ill_ip6_mib had better not be NULL.
- */
+ mibptr = ill->ill_ip_mib;
+
ASSERT(mibptr != NULL);
unspec_src = 0;
- BUMP_MIB(mibptr, ipv6OutRequests);
+ BUMP_MIB(mibptr, ipIfStatsHCOutRequests);
do_outrequests = B_FALSE;
zoneid = (zoneid_t)(uintptr_t)arg;
} else {
@@ -9494,6 +9508,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
/* XXX Any better way to get the protocol fast ? */
if (((mp = ipsec_attach_ipsec_out(mp, connp, NULL,
connp->conn_ulp)) == NULL)) {
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
if (need_decref)
CONN_DEC_REF(connp);
return;
@@ -9512,8 +9527,8 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
(mp->b_wptr - (uchar_t *)ip6h) < IPV6_HDR_LEN) {
ip0dbg(("ip_wput_v6: bad alignment or length\n"));
if (do_outrequests)
- BUMP_MIB(mibptr, ipv6OutRequests);
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsHCOutRequests);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
if (ill != NULL)
ill_refrele(ill);
@@ -9563,9 +9578,11 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
if ((mp->b_wptr - (uchar_t *)ip6i) == sizeof (ip6i_t)) {
if (!pullupmsg(mp, -1)) {
ip1dbg(("ip_wput_v6: pullupmsg failed\n"));
- if (do_outrequests)
- BUMP_MIB(mibptr, ipv6OutRequests);
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ if (do_outrequests) {
+ BUMP_MIB(mibptr,
+ ipIfStatsHCOutRequests);
+ }
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
if (ill != NULL)
ill_refrele(ill);
@@ -9605,9 +9622,11 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
ill = ill_lookup_on_ifindex(ip6i->ip6i_ifindex, 1,
NULL, NULL, NULL, NULL);
if (ill == NULL) {
- if (do_outrequests)
- BUMP_MIB(mibptr, ipv6OutRequests);
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ if (do_outrequests) {
+ BUMP_MIB(mibptr,
+ ipIfStatsHCOutRequests);
+ }
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
ip1dbg(("ip_wput_v6: bad ifindex %d\n",
ip6i->ip6i_ifindex));
if (need_decref)
@@ -9615,7 +9634,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
freemsg(first_mp);
return;
}
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
if (ip6i->ip6i_flags & IP6I_IFINDEX) {
/*
* Preserve the index so that when we return
@@ -9657,8 +9676,8 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
if (ire == NULL) {
if (do_outrequests)
BUMP_MIB(mibptr,
- ipv6OutRequests);
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ ipIfStatsHCOutRequests);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
ip1dbg(("ip_wput_v6: bad source "
"addr\n"));
freemsg(first_mp);
@@ -9689,7 +9708,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
unspec_src = 1;
if (do_outrequests && ill != NULL) {
- BUMP_MIB(mibptr, ipv6OutRequests);
+ BUMP_MIB(mibptr, ipIfStatsHCOutRequests);
do_outrequests = B_FALSE;
}
/*
@@ -9727,7 +9746,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
ill = conn_outgoing_pill;
attach_if = B_TRUE;
match_flags = MATCH_IRE_ILL;
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
/*
* Check if we need an ire that will not be
@@ -9768,7 +9787,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
*/
drop_if_delayed = B_TRUE;
match_flags = MATCH_IRE_ILL;
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
/*
* Check if we need an ire that will not be
@@ -9831,7 +9850,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
if (ill != NULL)
ill_refrele(ill);
ill = conn_outgoing_ill;
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
goto send_from_ill;
}
@@ -9915,11 +9934,11 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
/* Handle IRE_LOCAL's that might appear here */
if (ire->ire_type == IRE_CACHE) {
mibptr = ((ill_t *)ire->ire_stq->q_ptr)->
- ill_ip6_mib;
+ ill_ip_mib;
} else {
- mibptr = ire->ire_ipif->ipif_ill->ill_ip6_mib;
+ mibptr = ire->ire_ipif->ipif_ill->ill_ip_mib;
}
- BUMP_MIB(mibptr, ipv6OutRequests);
+ BUMP_MIB(mibptr, ipIfStatsHCOutRequests);
}
ASSERT(!attach_if);
@@ -10021,8 +10040,9 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
mp = ip_add_info_v6(mp, NULL, v6dstp);
if (mp == NULL) {
if (do_outrequests)
- BUMP_MIB(mibptr, ipv6OutRequests);
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr,
+ ipIfStatsHCOutRequests);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
if (mctl_present)
freeb(first_mp);
if (ill != NULL)
@@ -10051,9 +10071,9 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
" failed\n"));
if (do_outrequests) {
BUMP_MIB(mibptr,
- ipv6OutRequests);
+ ipIfStatsHCOutRequests);
}
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
if (ill != NULL)
ill_refrele(ill);
@@ -10073,7 +10093,7 @@ ip_output_v6(void *arg, mblk_t *mp, void *arg2, int caller)
}
}
if (do_outrequests)
- BUMP_MIB(mibptr, ipv6OutRequests);
+ BUMP_MIB(mibptr, ipIfStatsHCOutRequests);
if (need_decref)
CONN_DEC_REF(connp);
ip_newroute_v6(q, first_mp, v6dstp, &ip6h->ip6_src, NULL, zoneid);
@@ -10119,7 +10139,7 @@ multicast_discard:
ill_refrele(ill);
freemsg(first_mp);
if (do_outrequests)
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
if (need_decref)
CONN_DEC_REF(connp);
return;
@@ -10128,7 +10148,7 @@ multicast_discard:
ill = connp->conn_outgoing_pill;
attach_if = B_TRUE;
match_flags = MATCH_IRE_ILL;
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
/*
* Check if we need an ire that will not be
@@ -10264,12 +10284,14 @@ multicast_discard:
if (ill->ill_phyint->phyint_flags & PHYI_LOOPBACK)
v6dstp = &ill->ill_ipif->ipif_v6lcl_addr;
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
if (do_outrequests) {
- BUMP_MIB(mibptr, ipv6OutRequests);
+ BUMP_MIB(mibptr, ipIfStatsHCOutRequests);
do_outrequests = B_FALSE;
}
- BUMP_MIB(mibptr, ipv6OutMcastPkts);
+ BUMP_MIB(mibptr, ipIfStatsHCOutMcastPkts);
+ UPDATE_MIB(mibptr, ipIfStatsHCOutMcastOctets,
+ ntohs(ip6h->ip6_plen) + IPV6_HDR_LEN);
/*
* As we may lose the conn by the time we reach ip_wput_ire_v6
@@ -10285,7 +10307,7 @@ multicast_discard:
} else {
ASSERT(mp == first_mp);
if ((first_mp = ipsec_alloc_ipsec_out()) == NULL) {
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(mp);
if (ill != NULL)
ill_refrele(ill);
@@ -10309,9 +10331,9 @@ multicast_discard:
send_from_ill:
ASSERT(ill != NULL);
- ASSERT(mibptr == ill->ill_ip6_mib);
+ ASSERT(mibptr == ill->ill_ip_mib);
if (do_outrequests) {
- BUMP_MIB(mibptr, ipv6OutRequests);
+ BUMP_MIB(mibptr, ipIfStatsHCOutRequests);
do_outrequests = B_FALSE;
}
@@ -10460,7 +10482,7 @@ send_from_ill:
v6dstp);
}
if (mp == NULL) {
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
ill_refrele(ill);
return;
}
@@ -10474,7 +10496,7 @@ send_from_ill:
if (!pullupmsg(mp, -1)) {
ip1dbg(("ip_wput_v6: pullupmsg"
" failed\n"));
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -10530,7 +10552,7 @@ notv6:
ip_setqinfo(RD(q), IPV4_MINOR, B_TRUE);
}
}
- BUMP_MIB(mibptr, ipv6OutIPv4);
+ BUMP_MIB(mibptr, ipIfStatsOutWrongIPVersion);
(void) ip_output(arg, first_mp, arg2, caller);
if (ill != NULL)
ill_refrele(ill);
@@ -10573,7 +10595,7 @@ ip_wput_local_v6(queue_t *q, ill_t *ill, ip6_t *ip6h, mblk_t *first_mp,
uint8_t nexthdr;
uint16_t hdr_length;
ipsec_out_t *io;
- mib2_ipv6IfStatsEntry_t *mibptr;
+ mib2_ipIfStatsEntry_t *mibptr;
ilm_t *ilm;
uint_t nexthdr_offset;
@@ -10606,7 +10628,7 @@ ip_wput_local_v6(queue_t *q, ill_t *ill, ip6_t *ip6h, mblk_t *first_mp,
return;
nexthdr = ip6h->ip6_nxt;
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
/* Fastpath */
switch (nexthdr) {
@@ -10624,7 +10646,7 @@ ip_wput_local_v6(queue_t *q, ill_t *ill, ip6_t *ip6h, mblk_t *first_mp,
if (!ip_hdr_length_nexthdr_v6(mp, ip6h,
&hdr_length, &nexthdrp)) {
/* Malformed packet */
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -10694,7 +10716,7 @@ ip_wput_local_v6(queue_t *q, ill_t *ill, ip6_t *ip6h, mblk_t *first_mp,
if (!pullupmsg(mp, hdr_length + ICMP6_MINLEN)) {
ip1dbg(("ip_wput_v6: ICMP hdr pullupmsg"
" failed\n"));
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -10817,7 +10839,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
uint16_t hdr_length;
uint_t reachable = 0x0;
ill_t *ill;
- mib2_ipv6IfStatsEntry_t *mibptr;
+ mib2_ipIfStatsEntry_t *mibptr;
mblk_t *first_mp;
boolean_t mctl_present;
ipsec_out_t *io;
@@ -10908,7 +10930,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
}
ire_refrele(src_ire);
} else {
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutNoRoutes);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutNoRoutes);
if (src_ire != NULL) {
if (src_ire->ire_flags & RTF_BLACKHOLE) {
ire_refrele(src_ire);
@@ -10949,7 +10971,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
ip6h = (ip6_t *)mp->b_rptr;
nexthdr = ip6h->ip6_nxt;
- mibptr = ill->ill_ip6_mib;
+ mibptr = ill->ill_ip_mib;
if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->ip6_src) && !unspec_src) {
ipif_t *ipif;
@@ -11038,7 +11060,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
ire, fanout_flags);
}
} else {
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
ip1dbg(("ip_wput_ire_v6: "
"copymsg failed\n"));
}
@@ -11051,7 +11073,9 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
* Local multicast or just loopback on loopback
* interface.
*/
- BUMP_MIB(mibptr, ipv6OutMcastPkts);
+ BUMP_MIB(mibptr, ipIfStatsHCOutMcastPkts);
+ UPDATE_MIB(mibptr, ipIfStatsHCOutMcastOctets,
+ ntohs(ip6h->ip6_plen) + IPV6_HDR_LEN);
ip1dbg(("ip_wput_ire_v6: local multicast only\n"));
freemsg(first_mp);
return;
@@ -11102,7 +11126,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
}
return;
}
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -11130,7 +11154,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
if (!ip_hdr_length_nexthdr_v6(mp, ip6h,
&hdr_length, &nexthdrp)) {
/* Malformed packet */
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -11168,7 +11192,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
cksum_request + sizeof (int16_t))) {
ip1dbg(("ip_wput_v6: ICMP hdr pullupmsg"
" failed\n"));
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -11204,7 +11228,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
TCP_CHECKSUM_OFFSET + TCP_CHECKSUM_SIZE)) {
ip1dbg(("ip_wput_v6: TCP hdr pullupmsg"
" failed\n"));
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -11252,7 +11276,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
UDP_CHECKSUM_OFFSET + UDP_CHECKSUM_SIZE)) {
ip1dbg(("ip_wput_v6: UDP hdr pullupmsg"
" failed\n"));
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -11296,7 +11320,7 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
if (!pullupmsg(mp, hdr_length + ICMP6_MINLEN)) {
ip1dbg(("ip_wput_v6: ICMP hdr pullupmsg"
" failed\n"));
- BUMP_MIB(mibptr, ipv6OutDiscards);
+ BUMP_MIB(mibptr, ipIfStatsOutDiscards);
freemsg(first_mp);
return;
}
@@ -11328,8 +11352,8 @@ ip_wput_ire_v6(queue_t *q, mblk_t *mp, ire_t *ire, int unspec_src,
sizeof (*sctph))) {
ip1dbg(("ip_wput_v6: SCTP hdr pullupmsg"
" failed\n"));
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
freemsg(mp);
return;
}
@@ -11516,8 +11540,7 @@ free_mmd: IP6_STAT(ip6_frag_mdt_discarded);
freemsg(md_mp);
}
IP6_STAT(ip6_frag_mdt_allocfail);
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutFragFails);
- UPDATE_MIB(ill->ill_ip6_mib, ipv6OutDiscards, pkts);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragFails);
return;
}
IP6_STAT(ip6_frag_mdt_allocd);
@@ -11658,8 +11681,17 @@ free_mmd: IP6_STAT(ip6_frag_mdt_discarded);
ASSERT(mp->b_wptr == pld_ptr);
/* Update IP statistics */
- UPDATE_MIB(ill->ill_ip6_mib, ipv6OutFragCreates, pkts);
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutFragOKs);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsOutFragCreates, pkts);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragOKs);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutTransmits, pkts);
+ /*
+ * The ipv6 header len is accounted for in unfragmentable_len so
+ * when calculating the fragmentation overhead just add the frag
+ * header len.
+ */
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutOctets,
+ (ntohs(ip6h->ip6_plen) - (unfragmentable_len - IPV6_HDR_LEN)) +
+ pkts * (unfragmentable_len + sizeof (ip6_frag_t)));
IP6_STAT_UPDATE(ip6_frag_mdt_pkt_out, pkts);
ire->ire_ob_pkt_count += pkts;
@@ -11717,6 +11749,8 @@ ip_wput_frag_v6(mblk_t *mp, ire_t *ire, uint_t reachable, conn_t *connp,
ASSERT(ire->ire_type == IRE_CACHE);
ill = (ill_t *)ire->ire_stq->q_ptr;
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragReqds);
+
/*
* Determine the length of the unfragmentable portion of this
* datagram. This consists of the IPv6 header, a potential
@@ -11786,7 +11820,7 @@ ip_wput_frag_v6(mblk_t *mp, ire_t *ire, uint_t reachable, conn_t *connp,
hmp = allocb(unfragmentable_len + sizeof (ip6_frag_t) + ip_wroff_extra,
BPRI_HI);
if (hmp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutFragFails);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragFails);
freemsg(mp);
return;
}
@@ -11829,7 +11863,8 @@ ip_wput_frag_v6(mblk_t *mp, ire_t *ire, uint_t reachable, conn_t *connp,
if (hmp0 == NULL) {
freeb(hmp);
freemsg(mp);
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutFragFails);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsOutFragFails);
ip1dbg(("ip_wput_frag_v6: copyb failed\n"));
return;
}
@@ -11865,7 +11900,7 @@ ip_wput_frag_v6(mblk_t *mp, ire_t *ire, uint_t reachable, conn_t *connp,
freeb(hmp);
freeb(hmp0);
ip1dbg(("ip_carve_mp: failed\n"));
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutFragFails);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragFails);
return;
}
hmp0->b_cont = dmp;
@@ -11876,10 +11911,10 @@ ip_wput_frag_v6(mblk_t *mp, ire_t *ire, uint_t reachable, conn_t *connp,
ip_xmit_v6(hmp0, ire, reachable | IP6_NO_IPPOLICY, connp,
caller, NULL);
reachable = 0; /* No need to redo state machine in loop */
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutFragCreates);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragCreates);
offset += mlen;
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutFragOKs);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutFragOKs);
}
/*
@@ -12037,7 +12072,7 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
"interface.\n", AF_INET6,
&ip6h->ip6_dst);
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
freemsg(mp);
return;
}
@@ -12181,8 +12216,8 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
if (IP6_OUT_IPP(flags)) {
ip_process(IPP_LOCAL_OUT, &mp, ill_index);
if (mp == NULL) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
if (next_mp != NULL)
freemsg(next_mp);
if (ire != save_ire) {
@@ -12215,8 +12250,8 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
mp1 = copyb(mp1);
mutex_exit(&nce->nce_lock);
if (mp1 == NULL) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
freemsg(mp);
if (next_mp != NULL)
freemsg(next_mp);
@@ -12262,8 +12297,8 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
mp1 = copyb(mp1);
mutex_exit(&nce->nce_lock);
if (mp1 == NULL) {
- BUMP_MIB(ill->ill_ip6_mib,
- ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsOutDiscards);
freemsg(mp);
if (next_mp != NULL)
freemsg(next_mp);
@@ -12318,12 +12353,21 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
}
/*
- * Update ire counters; for save_ire, this has been
- * done by the caller.
+ * Update ire and MIB counters; for save_ire, this has
+ * been done by the caller.
*/
if (ire != save_ire) {
UPDATE_OB_PKT_COUNT(ire);
ire->ire_last_used_time = lbolt;
+
+ if (IN6_IS_ADDR_MULTICAST(&ip6h->ip6_dst)) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsHCOutMcastPkts);
+ UPDATE_MIB(ill->ill_ip_mib,
+ ipIfStatsHCOutMcastOctets,
+ ntohs(ip6h->ip6_plen) +
+ IPV6_HDR_LEN);
+ }
}
/*
@@ -12335,6 +12379,11 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
* packet was originally TCP or not currently.
*/
if (io == NULL) {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsHCOutTransmits);
+ UPDATE_MIB(ill->ill_ip_mib,
+ ipIfStatsHCOutOctets,
+ ntohs(ip6h->ip6_plen) + IPV6_HDR_LEN);
putnext(stq, mp);
} else {
/*
@@ -12346,6 +12395,12 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
/* IPsec kstats: bump lose counter */
freemsg(mp1);
} else {
+ BUMP_MIB(ill->ill_ip_mib,
+ ipIfStatsHCOutTransmits);
+ UPDATE_MIB(ill->ill_ip_mib,
+ ipIfStatsHCOutOctets,
+ ntohs(ip6h->ip6_plen) +
+ IPV6_HDR_LEN);
ipsec_hw_putnext(stq, mp);
}
}
@@ -12535,7 +12590,7 @@ ip_xmit_v6(mblk_t *mp, ire_t *ire, uint_t flags, conn_t *connp,
}
return;
}
- BUMP_MIB(ill->ill_ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
freemsg(mp);
return;
}
diff --git a/usr/src/uts/common/inet/ip/ip_ftable.c b/usr/src/uts/common/inet/ip/ip_ftable.c
index 409455cb84..0e34f0040c 100644
--- a/usr/src/uts/common/inet/ip/ip_ftable.c
+++ b/usr/src/uts/common/inet/ip/ip_ftable.c
@@ -1396,9 +1396,9 @@ ipfil_sendpkt(const struct sockaddr *dst_addr, mblk_t *mp, uint_t ifindex,
}
discard:
if (dst_addr->sa_family == AF_INET) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
} else {
- BUMP_MIB(&ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutDiscards);
}
if (ire != NULL)
ire_refrele(ire);
diff --git a/usr/src/uts/common/inet/ip/ip_if.c b/usr/src/uts/common/inet/ip/ip_if.c
index cd40a7e91d..3ba060607a 100644
--- a/usr/src/uts/common/inet/ip/ip_if.c
+++ b/usr/src/uts/common/inet/ip/ip_if.c
@@ -82,6 +82,7 @@
#include <inet/tun.h>
#include <inet/sctp_ip.h>
#include <inet/ip_netinfo.h>
+#include <inet/mib2.h>
#include <net/pfkeyv2.h>
#include <inet/ipsec_info.h>
@@ -392,9 +393,9 @@ static areq_t ip_areq_template = {
0, /* flags */
sizeof (areq_t) + IP_ADDR_LEN, /* sender addr offset */
IP_ADDR_LEN, /* sender addr length */
- 6, /* xmit_count */
- 1000, /* (re)xmit_interval in milliseconds */
- 4 /* max # of requests to buffer */
+ AR_EQ_DEFAULT_XMIT_COUNT, /* xmit_count */
+ AR_EQ_DEFAULT_XMIT_INTERVAL, /* (re)xmit_interval in milliseconds */
+ AR_EQ_DEFAULT_MAX_BUFFERED /* max # of requests to buffer */
/* anything else filled in by the code */
};
@@ -580,35 +581,73 @@ ipif_rand(void)
}
/*
- * Allocate per-interface mibs. Only used for ipv6.
+ * Allocate per-interface mibs.
* Returns true if ok. False otherwise.
* ipsq may not yet be allocated (loopback case ).
*/
static boolean_t
ill_allocate_mibs(ill_t *ill)
{
- ASSERT(ill->ill_isv6);
-
/* Already allocated? */
- if (ill->ill_ip6_mib != NULL) {
- ASSERT(ill->ill_icmp6_mib != NULL);
+ if (ill->ill_ip_mib != NULL) {
+ if (ill->ill_isv6)
+ ASSERT(ill->ill_icmp6_mib != NULL);
return (B_TRUE);
}
- ill->ill_ip6_mib = kmem_zalloc(sizeof (*ill->ill_ip6_mib),
+ ill->ill_ip_mib = kmem_zalloc(sizeof (*ill->ill_ip_mib),
KM_NOSLEEP);
- if (ill->ill_ip6_mib == NULL) {
+ if (ill->ill_ip_mib == NULL) {
return (B_FALSE);
}
+
+ /* Setup static information */
+ SET_MIB(ill->ill_ip_mib->ipIfStatsEntrySize,
+ sizeof (mib2_ipIfStatsEntry_t));
+ if (ill->ill_isv6) {
+ ill->ill_ip_mib->ipIfStatsIPVersion = MIB2_INETADDRESSTYPE_ipv6;
+ SET_MIB(ill->ill_ip_mib->ipIfStatsAddrEntrySize,
+ sizeof (mib2_ipv6AddrEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsRouteEntrySize,
+ sizeof (mib2_ipv6RouteEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsNetToMediaEntrySize,
+ sizeof (mib2_ipv6NetToMediaEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsMemberEntrySize,
+ sizeof (ipv6_member_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsGroupSourceEntrySize,
+ sizeof (ipv6_grpsrc_t));
+ } else {
+ ill->ill_ip_mib->ipIfStatsIPVersion = MIB2_INETADDRESSTYPE_ipv4;
+ SET_MIB(ill->ill_ip_mib->ipIfStatsAddrEntrySize,
+ sizeof (mib2_ipAddrEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsRouteEntrySize,
+ sizeof (mib2_ipRouteEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsNetToMediaEntrySize,
+ sizeof (mib2_ipNetToMediaEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsMemberEntrySize,
+ sizeof (ip_member_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsGroupSourceEntrySize,
+ sizeof (ip_grpsrc_t));
+
+ /*
+ * For a v4 ill, we are done at this point, because per ill
+ * icmp mibs are only used for v6.
+ */
+ return (B_TRUE);
+ }
+
ill->ill_icmp6_mib = kmem_zalloc(sizeof (*ill->ill_icmp6_mib),
KM_NOSLEEP);
if (ill->ill_icmp6_mib == NULL) {
- kmem_free(ill->ill_ip6_mib, sizeof (*ill->ill_ip6_mib));
- ill->ill_ip6_mib = NULL;
+ kmem_free(ill->ill_ip_mib, sizeof (*ill->ill_ip_mib));
+ ill->ill_ip_mib = NULL;
return (B_FALSE);
}
+ /* static icmp info */
+ ill->ill_icmp6_mib->ipv6IfIcmpEntrySize =
+ sizeof (mib2_ipv6IfIcmpEntry_t);
/*
- * The ipv6Ifindex and ipv6IfIcmpIndex will be assigned later
+ * The ipIfStatsIfindex and ipv6IfIcmpIndex will be assigned later
* after the phyint merge occurs in ipif_set_values -> ill_glist_insert
* -> ill_phyint_reinit
*/
@@ -978,11 +1017,22 @@ ill_delete_tail(ill_t *ill)
static void
ill_free_mib(ill_t *ill)
{
- if (ill->ill_ip6_mib != NULL) {
- kmem_free(ill->ill_ip6_mib, sizeof (*ill->ill_ip6_mib));
- ill->ill_ip6_mib = NULL;
+ /*
+ * MIB statistics must not be lost, so when an interface
+ * goes away the counter values will be added to the global
+ * MIBs.
+ */
+ if (ill->ill_ip_mib != NULL) {
+ if (ill->ill_isv6)
+ ip_mib2_add_ip_stats(&ip6_mib, ill->ill_ip_mib);
+ else
+ ip_mib2_add_ip_stats(&ip_mib, ill->ill_ip_mib);
+
+ kmem_free(ill->ill_ip_mib, sizeof (*ill->ill_ip_mib));
+ ill->ill_ip_mib = NULL;
}
if (ill->ill_icmp6_mib != NULL) {
+ ip_mib2_add_icmp6_stats(&icmp6_mib, ill->ill_icmp6_mib);
kmem_free(ill->ill_icmp6_mib, sizeof (*ill->ill_icmp6_mib));
ill->ill_icmp6_mib = NULL;
}
@@ -3766,7 +3816,6 @@ ill_frag_timeout(ill_t *ill, time_t dead_interval)
* the icmp messages after we have dropped the lock.
*/
if (ill->ill_isv6) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6ReasmFails);
if (hdr_length != 0) {
mp->b_next = send_icmp_head_v6;
send_icmp_head_v6 = mp;
@@ -3774,7 +3823,6 @@ ill_frag_timeout(ill_t *ill, time_t dead_interval)
freemsg(mp);
}
} else {
- BUMP_MIB(&ip_mib, ipReasmFails);
if (hdr_length != 0) {
mp->b_next = send_icmp_head;
send_icmp_head = mp;
@@ -3782,6 +3830,7 @@ ill_frag_timeout(ill_t *ill, time_t dead_interval)
freemsg(mp);
}
}
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmFails);
freeb(ipf->ipf_mp);
}
mutex_exit(&ipfb->ipfb_lock);
@@ -3950,7 +3999,7 @@ ill_frag_free_pkts(ill_t *ill, ipfb_t *ipfb, ipf_t *ipf, int free_cnt)
ASSERT(ipfb->ipfb_frag_pkts > 0);
ipfb->ipfb_frag_pkts--;
freemsg(mp);
- BUMP_MIB(&ip_mib, ipReasmFails);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmFails);
}
if (ipf)
@@ -5058,11 +5107,11 @@ ill_lookup_on_name(char *name, boolean_t do_alloc, boolean_t isv6,
if (isv6) {
ill->ill_isv6 = B_TRUE;
ill->ill_max_frag += IPV6_HDR_LEN + 20; /* for TCP */
- if (!ill_allocate_mibs(ill))
- goto done;
} else {
ill->ill_max_frag += IP_SIMPLE_HDR_LENGTH + 20;
}
+ if (!ill_allocate_mibs(ill))
+ goto done;
ill->ill_max_mtu = ill->ill_max_frag;
/*
* ipif_loopback_name can't be pointed at directly because its used
@@ -22540,9 +22589,9 @@ ill_phyint_reinit(ill_t *ill)
* Now that the phyint's ifindex has been assigned, complete the
* remaining
*/
+
+ ill->ill_ip_mib->ipIfStatsIfIndex = ill->ill_phyint->phyint_ifindex;
if (ill->ill_isv6) {
- ill->ill_ip6_mib->ipv6IfIndex =
- ill->ill_phyint->phyint_ifindex;
ill->ill_icmp6_mib->ipv6IfIcmpIfIndex =
ill->ill_phyint->phyint_ifindex;
}
@@ -22843,14 +22892,11 @@ ipif_set_values(queue_t *q, mblk_t *mp, char *interf_name, uint_t *new_ppa_ptr)
ASSERT(ill->ill_phyint != NULL);
/*
- * The ipv6Ifindex and ipv6IfIcmpIfIndex assignments will
+ * The ipIfStatsIfindex and ipv6IfIcmpIfIndex assignments will
* be completed in ill_glist_insert -> ill_phyint_reinit
*/
- if (ill->ill_isv6) {
- /* allocate v6 mib */
- if (!ill_allocate_mibs(ill))
- return (ENOMEM);
- }
+ if (!ill_allocate_mibs(ill))
+ return (ENOMEM);
/*
* Pick a default sap until we get the DL_INFO_ACK back from
diff --git a/usr/src/uts/common/inet/ip/ip_ndp.c b/usr/src/uts/common/inet/ip/ip_ndp.c
index 4427ad5a48..8ce4df9ec7 100644
--- a/usr/src/uts/common/inet/ip/ip_ndp.c
+++ b/usr/src/uts/common/inet/ip/ip_ndp.c
@@ -2156,7 +2156,7 @@ ndp_input(ill_t *ill, mblk_t *mp, mblk_t *dl_mp)
if (!pullupmsg(mp, -1)) {
ip1dbg(("ndp_input: pullupmsg failed\n"));
- BUMP_MIB(ill->ill_ip6_mib, ipv6InDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsInDiscards);
goto done;
}
ip6h = (ip6_t *)mp->b_rptr;
diff --git a/usr/src/uts/common/inet/ip/spd.c b/usr/src/uts/common/inet/ip/spd.c
index 1623107bca..db9f0eac56 100644
--- a/usr/src/uts/common/inet/ip/spd.c
+++ b/usr/src/uts/common/inet/ip/spd.c
@@ -4001,7 +4001,6 @@ ipsec_attach_ipsec_out(mblk_t *mp, conn_t *connp, ipsec_policy_t *pol,
if (ipsec_mp == NULL) {
ipsec_rl_strlog(IP_MOD_ID, 0, 0, SL_ERROR|SL_NOTE,
"ipsec_attach_ipsec_out: Allocation failure\n");
- BUMP_MIB(&ip_mib, ipOutDiscards);
ip_drop_packet(mp, B_FALSE, NULL, NULL, &ipdrops_spd_nomem,
&spd_dropper);
return (NULL);
@@ -4371,7 +4370,7 @@ ip_wput_attach_policy(mblk_t *ipsec_mp, ipha_t *ipha, ip6_t *ip6h, ire_t *ire,
default:
if (!ip_hdr_length_nexthdr_v6(mp, ip6h,
&hdr_len, &nexthdrp)) {
- BUMP_MIB(&ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutDiscards);
freemsg(ipsec_mp); /* Not IPsec-related drop. */
return (NULL);
}
@@ -4382,9 +4381,9 @@ ip_wput_attach_policy(mblk_t *ipsec_mp, ipha_t *ipha, ip6_t *ip6h, ire_t *ire,
if (!ipsec_init_outbound_ports(&sel, mp, ipha, ip6h, 0)) {
if (ipha != NULL) {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsOutDiscards);
} else {
- BUMP_MIB(&ip6_mib, ipv6OutDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsOutDiscards);
}
/* Callee dropped the packet. */
diff --git a/usr/src/uts/common/inet/ip6.h b/usr/src/uts/common/inet/ip6.h
index 966983bb20..b1b1419ac4 100644
--- a/usr/src/uts/common/inet/ip6.h
+++ b/usr/src/uts/common/inet/ip6.h
@@ -334,7 +334,7 @@ extern const in6_addr_t ipv6_unspecified_group;
* IPv6 mibs when the interface (ill) is not known.
* When the ill is known the per-interface mib in the ill is used.
*/
-extern mib2_ipv6IfStatsEntry_t ip6_mib;
+extern mib2_ipIfStatsEntry_t ip6_mib;
extern mib2_ipv6IfIcmpEntry_t icmp6_mib;
/*
diff --git a/usr/src/uts/common/inet/mib2.h b/usr/src/uts/common/inet/mib2.h
index d305d5631e..ef8e159f20 100644
--- a/usr/src/uts/common/inet/mib2.h
+++ b/usr/src/uts/common/inet/mib2.h
@@ -132,6 +132,7 @@ extern "C" {
#define SET_MIB(x, y) x = y
#define BUMP_LOCAL(x) (x)++
#define UPDATE_LOCAL(x, y) (x) += (y)
+#define SYNC32_MIB(s, m32, m64) SET_MIB((s)->m32, (s)->m64 & 0xffffffff)
#define OCTET_LENGTH 32 /* Must be at least LIFNAMSIZ */
typedef struct Octet_s {
@@ -149,15 +150,19 @@ typedef Octet_t DeviceName;
typedef Octet_t PhysAddress;
typedef uint32_t DeviceIndex; /* Interface index */
+#define MIB2_UNKNOWN_INTERFACE 0
+#define MIB2_UNKNOWN_PROCESS 0
+
/*
* IP group
*/
-#define MIB2_IP_ADDR 20 /* ipAddrEntry */
-#define MIB2_IP_ROUTE 21 /* ipRouteEntry */
-#define MIB2_IP_MEDIA 22 /* ipNetToMediaEntry */
-#define MIB2_IP6_ROUTE 23 /* ipv6RouteEntry */
-#define MIB2_IP6_MEDIA 24 /* ipv6NetToMediaEntry */
-#define MIB2_IP6_ADDR 25 /* ipv6AddrEntry */
+#define MIB2_IP_ADDR 20 /* ipAddrEntry */
+#define MIB2_IP_ROUTE 21 /* ipRouteEntry */
+#define MIB2_IP_MEDIA 22 /* ipNetToMediaEntry */
+#define MIB2_IP6_ROUTE 23 /* ipv6RouteEntry */
+#define MIB2_IP6_MEDIA 24 /* ipv6NetToMediaEntry */
+#define MIB2_IP6_ADDR 25 /* ipv6AddrEntry */
+#define MIB2_IP_TRAFFIC_STATS 31 /* ipIfStatsEntry (IPv4) */
#define EXPER_IP_GROUP_MEMBERSHIP 100
#define EXPER_IP6_GROUP_MEMBERSHIP 101
#define EXPER_IP_GROUP_SOURCES 102
@@ -371,6 +376,208 @@ typedef struct mib2_ipv6IfStatsEntry {
} mib2_ipv6IfStatsEntry_t;
/*
+ * Per interface IP statistics, both v4 and v6.
+ *
+ * Some applications expect to get mib2_ipv6IfStatsEntry_t structs back when
+ * making a request. To ensure backwards compatability, the first
+ * sizeof(mib2_ipv6IfStatsEntry_t) bytes of the structure is identical to
+ * mib2_ipv6IfStatsEntry_t. This should work as long the application is
+ * written correctly (i.e., using ipv6IfStatsEntrySize to get the size of
+ * the struct)
+ *
+ * RFC4293 introduces several new counters, as well as defining 64-bit
+ * versions of existing counters. For a new counters, if they have both 32-
+ * and 64-bit versions, then we only added the latter. However, for already
+ * existing counters, we have added the 64-bit versions without removing the
+ * old (32-bit) ones. The 64- and 32-bit counters will only be synchronized
+ * when the structure contains IPv6 statistics, which is done to ensure
+ * backwards compatibility.
+ */
+
+/* The following are defined in RFC 4001 and are used for ipIfStatsIPVersion */
+#define MIB2_INETADDRESSTYPE_unknown 0
+#define MIB2_INETADDRESSTYPE_ipv4 1
+#define MIB2_INETADDRESSTYPE_ipv6 2
+
+/*
+ * On amd64, the alignment requirements for long long's is different for
+ * 32 and 64 bits. If we have a struct containing long long's that is being
+ * passed between a 64-bit kernel to a 32-bit application, then it is very
+ * likely that the size of the struct will differ due to padding. Therefore, we
+ * pack the data to ensure that the struct size is the same for 32- and
+ * 64-bits.
+ */
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
+
+typedef struct mib2_ipIfStatsEntry {
+
+ /* Local ifindex to identify the interface */
+ DeviceIndex ipIfStatsIfIndex;
+
+ /* forwarder? 1 gateway, 2 NOT gateway { ipv6MIBObjects 1} RW */
+ int ipIfStatsForwarding;
+ /* default Hoplimit for IPv6 { ipv6MIBObjects 2} RW */
+ int ipIfStatsDefaultHopLimit;
+#define ipIfStatsDefaultTTL ipIfStatsDefaultHopLimit
+
+ int ipIfStatsEntrySize;
+ int ipIfStatsAddrEntrySize;
+ int ipIfStatsRouteEntrySize;
+ int ipIfStatsNetToMediaEntrySize;
+ int ipIfStatsMemberEntrySize;
+ int ipIfStatsGroupSourceEntrySize;
+
+ /* # input datagrams (incl errors) { ipIfStatsEntry 3 } */
+ Counter ipIfStatsInReceives;
+ /* # errors in IP headers and options { ipIfStatsEntry 7 } */
+ Counter ipIfStatsInHdrErrors;
+ /* # exceeds outgoing link MTU(v6 only) { ipv6IfStatsEntry 3 } */
+ Counter ipIfStatsInTooBigErrors;
+ /* # discarded due to no route to dest { ipIfStatsEntry 8 } */
+ Counter ipIfStatsInNoRoutes;
+ /* # invalid or unsupported addresses { ipIfStatsEntry 9 } */
+ Counter ipIfStatsInAddrErrors;
+ /* # unknown next header { ipIfStatsEntry 10 } */
+ Counter ipIfStatsInUnknownProtos;
+ /* # too short packets { ipIfStatsEntry 11 } */
+ Counter ipIfStatsInTruncatedPkts;
+ /* # discarded e.g. due to no buffers { ipIfStatsEntry 17 } */
+ Counter ipIfStatsInDiscards;
+ /* # delivered to upper layer protocols { ipIfStatsEntry 18 } */
+ Counter ipIfStatsInDelivers;
+ /* # forwarded out interface { ipIfStatsEntry 23 } */
+ Counter ipIfStatsOutForwDatagrams;
+ /* # originated out interface { ipIfStatsEntry 20 } */
+ Counter ipIfStatsOutRequests;
+ /* # discarded e.g. due to no buffers { ipIfStatsEntry 25 } */
+ Counter ipIfStatsOutDiscards;
+ /* # sucessfully fragmented packets { ipIfStatsEntry 27 } */
+ Counter ipIfStatsOutFragOKs;
+ /* # fragmentation failed { ipIfStatsEntry 28 } */
+ Counter ipIfStatsOutFragFails;
+ /* # fragments created { ipIfStatsEntry 29 } */
+ Counter ipIfStatsOutFragCreates;
+ /* # fragments to reassemble { ipIfStatsEntry 14 } */
+ Counter ipIfStatsReasmReqds;
+ /* # packets after reassembly { ipIfStatsEntry 15 } */
+ Counter ipIfStatsReasmOKs;
+ /* # reassembly failed { ipIfStatsEntry 16 } */
+ Counter ipIfStatsReasmFails;
+ /* # received multicast packets { ipIfStatsEntry 34 } */
+ Counter ipIfStatsInMcastPkts;
+ /* # transmitted multicast packets { ipIfStatsEntry 38 } */
+ Counter ipIfStatsOutMcastPkts;
+
+ /*
+ * In addition to defined MIBs
+ */
+
+ /* # discarded due to no route to dest { ipSystemStatsEntry 22 } */
+ Counter ipIfStatsOutNoRoutes;
+ /* # of complete duplicates in reassembly */
+ Counter ipIfStatsReasmDuplicates;
+ /* # of partial duplicates in reassembly */
+ Counter ipIfStatsReasmPartDups;
+ /* # of packets not forwarded due to adminstrative reasons */
+ Counter ipIfStatsForwProhibits;
+ /* # of UDP packets with bad UDP checksums */
+ Counter udpInCksumErrs;
+#define udpIfStatsInCksumErrs udpInCksumErrs
+ /* # of UDP packets droped due to queue overflow */
+ Counter udpInOverflows;
+#define udpIfStatsInOverflows udpInOverflows
+ /*
+ * # of RAW IP packets (all IP protocols except UDP, TCP
+ * and ICMP) droped due to queue overflow
+ */
+ Counter rawipInOverflows;
+#define rawipIfStatsInOverflows rawipInOverflows
+
+ /*
+ * # of IP packets received with the wrong version (i.e., not equal
+ * to ipIfStatsIPVersion) and that were dropped.
+ */
+ Counter ipIfStatsInWrongIPVersion;
+ /*
+ * Depending on the value of ipIfStatsIPVersion, this counter tracks
+ * v4: # of IPv6 packets transmitted by ip_wput or,
+ * v6: # of IPv4 packets transmitted by ip_wput_v6.
+ */
+ Counter ipIfStatsOutWrongIPVersion;
+ /*
+ * Depending on the value of ipIfStatsIPVersion, this counter tracks
+ * # of times ip_wput has switched to become ip_wput_v6, or vice versa.
+ */
+ Counter ipIfStatsOutSwitchIPVersion;
+
+ /*
+ * Fields defined in RFC 4293
+ */
+
+ /* ip version { ipIfStatsEntry 1 } */
+ int ipIfStatsIPVersion;
+ /* # input datagrams (incl errors) { ipIfStatsEntry 4 } */
+ Counter64 ipIfStatsHCInReceives;
+ /* # input octets (incl errors) { ipIfStatsEntry 6 } */
+ Counter64 ipIfStatsHCInOctets;
+ /*
+ * { ipIfStatsEntry 13 }
+ * # input datagrams for which a forwarding attempt was made
+ */
+ Counter64 ipIfStatsHCInForwDatagrams;
+ /* # delivered to upper layer protocols { ipIfStatsEntry 19 } */
+ Counter64 ipIfStatsHCInDelivers;
+ /* # originated out interface { ipIfStatsEntry 21 } */
+ Counter64 ipIfStatsHCOutRequests;
+ /* # forwarded out interface { ipIfStatsEntry 23 } */
+ Counter64 ipIfStatsHCOutForwDatagrams;
+ /* # dg's requiring fragmentation { ipIfStatsEntry 26 } */
+ Counter ipIfStatsOutFragReqds;
+ /* # output datagrams { ipIfStatsEntry 31 } */
+ Counter64 ipIfStatsHCOutTransmits;
+ /* # output octets { ipIfStatsEntry 33 } */
+ Counter64 ipIfStatsHCOutOctets;
+ /* # received multicast datagrams { ipIfStatsEntry 35 } */
+ Counter64 ipIfStatsHCInMcastPkts;
+ /* # received multicast octets { ipIfStatsEntry 37 } */
+ Counter64 ipIfStatsHCInMcastOctets;
+ /* # transmitted multicast datagrams { ipIfStatsEntry 39 } */
+ Counter64 ipIfStatsHCOutMcastPkts;
+ /* # transmitted multicast octets { ipIfStatsEntry 41 } */
+ Counter64 ipIfStatsHCOutMcastOctets;
+ /* # received broadcast datagrams { ipIfStatsEntry 43 } */
+ Counter64 ipIfStatsHCInBcastPkts;
+ /* # transmitted broadcast datagrams { ipIfStatsEntry 45 } */
+ Counter64 ipIfStatsHCOutBcastPkts;
+
+ /*
+ * Fields defined in mib2_ip_t
+ */
+
+ /* # of incoming packets that succeeded policy checks */
+ Counter ipsecInSucceeded;
+#define ipsecIfStatsInSucceeded ipsecInSucceeded
+ /* # of incoming packets that failed policy checks */
+ Counter ipsecInFailed;
+#define ipsecIfStatsInFailed ipsecInFailed
+ /* # of bad IP header checksums */
+ Counter ipInCksumErrs;
+#define ipIfStatsInCksumErrs ipInCksumErrs
+ /* total # of segments recv'd with error { tcp 14 } */
+ Counter tcpInErrs;
+#define tcpIfStatsInErrs tcpInErrs
+ /* # of recv'd dg's not deliverable (no appl.) { udp 2 } */
+ Counter udpNoPorts;
+#define udpIfStatsNoPorts udpNoPorts
+} mib2_ipIfStatsEntry_t;
+
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
+
+/*
* The IP address table contains this entity's IP addressing information.
*
* ipAddrTable OBJECT-TYPE
@@ -411,6 +618,7 @@ typedef struct mib2_ipAddrEntry {
int ae_subnet_len; /* Subnet prefix length */
IpAddress ae_src_addr; /* Source address */
} ipAdEntInfo;
+ uint32_t ipAdEntRetransmitTime; /* ipInterfaceRetransmitTime */
} mib2_ipAddrEntry_t;
/*
@@ -455,6 +663,11 @@ typedef struct mib2_ipv6AddrEntry {
int ae_subnet_len; /* Subnet prefix length */
Ip6Address ae_src_addr; /* Source address */
} ipv6AddrInfo;
+ uint32_t ipv6AddrReasmMaxSize; /* InterfaceReasmMaxSize */
+ Ip6Address ipv6AddrIdentifier; /* InterfaceIdentifier */
+ uint32_t ipv6AddrIdentifierLen;
+ uint32_t ipv6AddrReachableTime; /* InterfaceReachableTime */
+ uint32_t ipv6AddrRetransmitTime; /* InterfaceRetransmitTime */
} mib2_ipv6AddrEntry_t;
/*
@@ -940,6 +1153,10 @@ typedef struct mib2_ipv6IfIcmpEntry {
/* Old name retained for compatibility */
#define MIB2_TCP_13 MIB2_TCP_CONN
+/* Pack data in mib2_tcp to make struct size the same for 32- and 64-bits */
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
typedef struct mib2_tcp {
/* algorithm used for transmit timeout value { tcp 1 } */
int tcpRtoAlgorithm;
@@ -1052,8 +1269,21 @@ typedef struct mib2_tcp {
Counter tcpOutSackRetransSegs;
int tcp6ConnTableSize; /* Size of tcp6ConnEntry_t */
+
+ /*
+ * fields from RFC 4022
+ */
+
+ /* total # of segments recv'd { tcp 17 } */
+ Counter64 tcpHCInSegs;
+ /* total # of segments sent { tcp 18 } */
+ Counter64 tcpHCOutSegs;
} mib2_tcp_t;
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
+
/*
* The TCP/IPv4 connection table {tcp 13} contains information about this
* entity's existing TCP connections over IPv4.
@@ -1072,6 +1302,10 @@ typedef struct mib2_tcp {
#define MIB2_TCP_timeWait 11
#define MIB2_TCP_deleteTCB 12 /* only writeable value */
+/* Pack data to make struct size the same for 32- and 64-bits */
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
typedef struct mib2_tcpConnEntry {
/* state of tcp connection { tcpConnEntry 1} RW */
int tcpConnState;
@@ -1103,7 +1337,15 @@ typedef struct mib2_tcpConnEntry {
/* actual internal state */
int ce_state;
} tcpConnEntryInfo;
+
+ /* pid of the processes that created this connection */
+ uint32_t tcpConnCreationProcess;
+ /* system uptime when the connection was created */
+ uint64_t tcpConnCreationTime;
} mib2_tcpConnEntry_t;
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
/*
@@ -1111,6 +1353,10 @@ typedef struct mib2_tcpConnEntry {
* entity's existing TCP connections over IPv6.
*/
+/* Pack data to make struct size the same for 32- and 64-bits */
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
typedef struct mib2_tcp6ConnEntry {
/* local ip addr for this connection { ipv6TcpConnEntry 1 } */
Ip6Address tcp6ConnLocalAddress;
@@ -1144,7 +1390,15 @@ typedef struct mib2_tcp6ConnEntry {
/* actual internal state */
int ce_state;
} tcp6ConnEntryInfo;
+
+ /* pid of the processes that created this connection */
+ uint32_t tcp6ConnCreationProcess;
+ /* system uptime when the connection was created */
+ uint64_t tcp6ConnCreationTime;
} mib2_tcp6ConnEntry_t;
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
/*
* the UDP group
@@ -1155,6 +1409,10 @@ typedef struct mib2_tcp6ConnEntry {
/* Old name retained for compatibility */
#define MIB2_UDP_5 MIB2_UDP_ENTRY
+/* Pack data to make struct size the same for 32- and 64-bits */
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
typedef struct mib2_udp {
/* total # of UDP datagrams sent upstream { udp 1 } */
Counter udpInDatagrams;
@@ -1167,7 +1425,19 @@ typedef struct mib2_udp {
int udpEntrySize; /* Size of udpEntry_t */
int udp6EntrySize; /* Size of udp6Entry_t */
Counter udpOutErrors;
+
+ /*
+ * fields from RFC 4113
+ */
+
+ /* total # of UDP datagrams sent upstream { udp 8 } */
+ Counter64 udpHCInDatagrams;
+ /* total # of dg's sent { udp 9 } */
+ Counter64 udpHCOutDatagrams;
} mib2_udp_t;
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
/*
* The UDP listener table contains information about this entity's UDP
@@ -1180,6 +1450,10 @@ typedef struct mib2_udp {
#define MIB2_UDP_connected 3
#define MIB2_UDP_unknown 4
+/* Pack data to make struct size the same for 32- and 64-bits */
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
typedef struct mib2_udpEntry {
/* local ip addr of listener { udpEntry 1 } */
IpAddress udpLocalAddress;
@@ -1190,7 +1464,21 @@ typedef struct mib2_udpEntry {
IpAddress ue_RemoteAddress;
int ue_RemotePort; /* In host byte order */
} udpEntryInfo;
+
+ /*
+ * RFC 4113
+ */
+
+ /* Unique id for this 4-tuple { udpEndpointEntry 7 } */
+ uint32_t udpInstance;
+ /* pid of the processes that created this endpoint */
+ uint32_t udpCreationProcess;
+ /* system uptime when the endpoint was created */
+ uint64_t udpCreationTime;
} mib2_udpEntry_t;
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
/*
* The UDP (for IPv6) listener table contains information about this
@@ -1198,6 +1486,10 @@ typedef struct mib2_udpEntry {
* currently accepting datagrams.
*/
+/* Pack data to make struct size the same for 32- and 64-bits */
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
typedef struct mib2_udp6Entry {
/* local ip addr of listener { ipv6UdpEntry 1 } */
Ip6Address udp6LocalAddress;
@@ -1210,7 +1502,21 @@ typedef struct mib2_udp6Entry {
Ip6Address ue_RemoteAddress;
int ue_RemotePort; /* In host byte order */
} udp6EntryInfo;
+
+ /*
+ * RFC 4113
+ */
+
+ /* Unique id for this 4-tuple { udpEndpointEntry 7 } */
+ uint32_t udp6Instance;
+ /* pid of the processes that created this endpoint */
+ uint32_t udp6CreationProcess;
+ /* system uptime when the endpoint was created */
+ uint64_t udp6CreationTime;
} mib2_udp6Entry_t;
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
/*
* the RAWIP group
diff --git a/usr/src/uts/common/inet/sctp/sctp_hash.c b/usr/src/uts/common/inet/sctp/sctp_hash.c
index 24e9278fce..90075507b4 100644
--- a/usr/src/uts/common/inet/sctp/sctp_hash.c
+++ b/usr/src/uts/common/inet/sctp/sctp_hash.c
@@ -455,7 +455,7 @@ ip_fanout_sctp(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
/* Assume IP provides aligned packets - otherwise toss */
if (!OK_32PTR(mp->b_rptr)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -483,7 +483,7 @@ ip_fanout_sctp(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
sctp = CONN2SCTP(connp);
/* Found a client; up it goes */
- BUMP_MIB(&ip_mib, ipInDelivers);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsHCInDelivers);
/*
* We check some fields in conn_t without holding a lock.
@@ -554,7 +554,7 @@ ip_fanout_sctp(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
if (mctl_present)
mp->b_prev = first_mp;
if (!sctp_add_recvq(sctp, mp, B_FALSE)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
}
mutex_exit(&sctp->sctp_lock);
@@ -567,7 +567,8 @@ ip_fanout_sctp(mblk_t *mp, ill_t *recv_ill, ipha_t *ipha,
if (mctl_present)
mp->b_prev = first_mp;
if (!sctp_add_recvq(sctp, mp, B_TRUE)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(first_mp);
}
mutex_exit(&sctp->sctp_recvq_lock);
diff --git a/usr/src/uts/common/inet/sctp/sctp_input.c b/usr/src/uts/common/inet/sctp/sctp_input.c
index e945a61616..ee963b4a2d 100644
--- a/usr/src/uts/common/inet/sctp/sctp_input.c
+++ b/usr/src/uts/common/inet/sctp/sctp_input.c
@@ -3199,7 +3199,7 @@ sctp_ootb_input(mblk_t *mp, ill_t *recv_ill, uint_t ipif_seqid,
* assume a single contiguous chunk of data.
*/
if (pullupmsg(mp, -1) == 0) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -3214,7 +3214,7 @@ sctp_ootb_input(mblk_t *mp, ill_t *recv_ill, uint_t ipif_seqid,
mlen = mp->b_wptr - (uchar_t *)(sctph + 1);
if ((ch = sctp_first_chunk((uchar_t *)(sctph + 1), mlen)) == NULL) {
dprint(3, ("sctp_ootb_input: invalid packet\n"));
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
return;
}
@@ -3235,7 +3235,8 @@ sctp_ootb_input(mblk_t *mp, ill_t *recv_ill, uint_t ipif_seqid,
mutex_enter(&sctp->sctp_lock);
if (sctp->sctp_running) {
if (!sctp_add_recvq(sctp, mp, B_FALSE)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(mp);
}
mutex_exit(&sctp->sctp_lock);
@@ -3297,6 +3298,7 @@ sctp_input(conn_t *connp, ipha_t *ipha, mblk_t *mp, mblk_t *first_mp,
first_mp = ipsec_check_inbound_policy(first_mp, connp,
ipha, NULL, mctl_present);
if (first_mp == NULL) {
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
SCTP_REFRELE(sctp);
return;
}
@@ -3339,6 +3341,7 @@ sctp_input(conn_t *connp, ipha_t *ipha, mblk_t *mp, mblk_t *first_mp,
&(((ip6_t *)ipha)->ip6_dst));
}
if (mp == NULL) {
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
SCTP_REFRELE(sctp);
if (mctl_present)
freeb(first_mp);
@@ -3359,7 +3362,7 @@ sctp_input(conn_t *connp, ipha_t *ipha, mblk_t *mp, mblk_t *first_mp,
if (mctl_present)
mp->b_prev = first_mp;
if (!sctp_add_recvq(sctp, mp, B_FALSE)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib, ipIfStatsInDiscards);
freemsg(first_mp);
}
mutex_exit(&sctp->sctp_lock);
@@ -3374,7 +3377,8 @@ sctp_input(conn_t *connp, ipha_t *ipha, mblk_t *mp, mblk_t *first_mp,
if (mctl_present)
mp->b_prev = first_mp;
if (!sctp_add_recvq(sctp, mp, B_TRUE)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(recv_ill->ill_ip_mib,
+ ipIfStatsInDiscards);
freemsg(first_mp);
}
mutex_exit(&sctp->sctp_recvq_lock);
@@ -3449,7 +3453,7 @@ sctp_input_data(sctp_t *sctp, mblk_t *mp, mblk_t *ipsec_mp)
* assume a single contiguous chunk of data.
*/
if (pullupmsg(mp, -1) == 0) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsInDiscards);
if (ipsec_mp != NULL)
freeb(ipsec_mp);
if (pinfo != NULL)
@@ -3467,7 +3471,7 @@ sctp_input_data(sctp_t *sctp, mblk_t *mp, mblk_t *ipsec_mp)
mlen = mp->b_wptr - (uchar_t *)(sctph + 1);
ch = sctp_first_chunk((uchar_t *)(sctph + 1), mlen);
if (ch == NULL) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsInDiscards);
if (ipsec_mp != NULL)
freeb(ipsec_mp);
freemsg(mp);
@@ -3475,7 +3479,7 @@ sctp_input_data(sctp_t *sctp, mblk_t *mp, mblk_t *ipsec_mp)
}
if (!sctp_check_input(sctp, ch, mlen, 1)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsInDiscards);
goto done;
}
/*
diff --git a/usr/src/uts/common/inet/tcp.h b/usr/src/uts/common/inet/tcp.h
index 67bf7aa4f2..e9c2600c6b 100644
--- a/usr/src/uts/common/inet/tcp.h
+++ b/usr/src/uts/common/inet/tcp.h
@@ -437,6 +437,7 @@ typedef struct tcp_s {
mblk_t *tcp_timercache;
cred_t *tcp_cred; /* Credentials when this was opened */
pid_t tcp_cpid; /* Process id when this was opened */
+ uint64_t tcp_open_time; /* time when this was opened */
union {
diff --git a/usr/src/uts/common/inet/tcp/tcp.c b/usr/src/uts/common/inet/tcp/tcp.c
index d19faf593c..fee934beae 100644
--- a/usr/src/uts/common/inet/tcp/tcp.c
+++ b/usr/src/uts/common/inet/tcp/tcp.c
@@ -2597,7 +2597,7 @@ tcp_adapt_ire(tcp_t *tcp, mblk_t *ire_mp)
if (tcp->tcp_ipversion == IPV4_VERSION) {
if (CLASSD(tcp->tcp_connp->conn_rem)) {
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsInDiscards);
return (0);
}
/*
@@ -4509,9 +4509,9 @@ tcp_closei_local(tcp_t *tcp)
if (!TCP_IS_SOCKET(tcp))
tcp_acceptor_hash_remove(tcp);
- UPDATE_MIB(&tcp_mib, tcpInSegs, tcp->tcp_ibsegs);
+ UPDATE_MIB(&tcp_mib, tcpHCInSegs, tcp->tcp_ibsegs);
tcp->tcp_ibsegs = 0;
- UPDATE_MIB(&tcp_mib, tcpOutSegs, tcp->tcp_obsegs);
+ UPDATE_MIB(&tcp_mib, tcpHCOutSegs, tcp->tcp_obsegs);
tcp->tcp_obsegs = 0;
/*
@@ -5950,6 +5950,8 @@ tcp_conn_request(void *arg, mblk_t *mp, void *arg2)
if (mp1 == NULL)
goto error1;
DB_CPID(mp1) = tcp->tcp_cpid;
+ eager->tcp_cpid = tcp->tcp_cpid;
+ eager->tcp_open_time = lbolt64;
/*
* We need to start the rto timer. In normal case, we start
@@ -7702,9 +7704,9 @@ tcp_reinit(tcp_t *tcp)
* Reset everything in the state vector, after updating global
* MIB data from instance counters.
*/
- UPDATE_MIB(&tcp_mib, tcpInSegs, tcp->tcp_ibsegs);
+ UPDATE_MIB(&tcp_mib, tcpHCInSegs, tcp->tcp_ibsegs);
tcp->tcp_ibsegs = 0;
- UPDATE_MIB(&tcp_mib, tcpOutSegs, tcp->tcp_obsegs);
+ UPDATE_MIB(&tcp_mib, tcpHCOutSegs, tcp->tcp_obsegs);
tcp->tcp_obsegs = 0;
tcp_close_mpp(&tcp->tcp_xmit_head);
@@ -7912,6 +7914,7 @@ tcp_reinit_values(tcp)
tcp->tcp_hard_bound = 0;
PRESERVE(tcp->tcp_cred);
PRESERVE(tcp->tcp_cpid);
+ PRESERVE(tcp->tcp_open_time);
PRESERVE(tcp->tcp_exclbind);
tcp->tcp_fin_acked = 0;
@@ -9628,6 +9631,7 @@ tcp_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
tcp->tcp_cred = connp->conn_cred = credp;
crhold(connp->conn_cred);
tcp->tcp_cpid = curproc->p_pid;
+ tcp->tcp_open_time = lbolt64;
connp->conn_zoneid = zoneid;
connp->conn_mlp_type = mlptSingle;
connp->conn_ulp_labeled = !is_system_labeled();
@@ -16108,9 +16112,9 @@ tcp_snmp_get(queue_t *q, mblk_t *mpctl)
continue; /* not in this zone */
tcp = connp->conn_tcp;
- UPDATE_MIB(&tcp_mib, tcpInSegs, tcp->tcp_ibsegs);
+ UPDATE_MIB(&tcp_mib, tcpHCInSegs, tcp->tcp_ibsegs);
tcp->tcp_ibsegs = 0;
- UPDATE_MIB(&tcp_mib, tcpOutSegs, tcp->tcp_obsegs);
+ UPDATE_MIB(&tcp_mib, tcpHCOutSegs, tcp->tcp_obsegs);
tcp->tcp_obsegs = 0;
tce6.tcp6ConnState = tce.tcpConnState =
@@ -16176,6 +16180,11 @@ tcp_snmp_get(queue_t *q, mblk_t *mpctl)
tce6.tcp6ConnEntryInfo.ce_mss = tcp->tcp_mss;
tce6.tcp6ConnEntryInfo.ce_state = tcp->tcp_state;
+ tce6.tcp6ConnCreationProcess =
+ (tcp->tcp_cpid < 0) ? MIB2_UNKNOWN_PROCESS :
+ tcp->tcp_cpid;
+ tce6.tcp6ConnCreationTime = tcp->tcp_open_time;
+
(void) snmp_append_data2(mp6_conn_ctl->b_cont,
&mp6_conn_tail, (char *)&tce6, sizeof (tce6));
@@ -16237,6 +16246,11 @@ tcp_snmp_get(queue_t *q, mblk_t *mpctl)
tce.tcpConnEntryInfo.ce_state =
tcp->tcp_state;
+ tce.tcpConnCreationProcess =
+ (tcp->tcp_cpid < 0) ? MIB2_UNKNOWN_PROCESS :
+ tcp->tcp_cpid;
+ tce.tcpConnCreationTime = tcp->tcp_open_time;
+
(void) snmp_append_data2(mp_conn_ctl->b_cont,
&mp_conn_tail, (char *)&tce, sizeof (tce));
@@ -16253,6 +16267,9 @@ tcp_snmp_get(queue_t *q, mblk_t *mpctl)
/* fixed length structure for IPv4 and IPv6 counters */
SET_MIB(tcp_mib.tcpConnTableSize, sizeof (mib2_tcpConnEntry_t));
SET_MIB(tcp_mib.tcp6ConnTableSize, sizeof (mib2_tcp6ConnEntry_t));
+ /* synchronize 32- and 64-bit counters */
+ SYNC32_MIB(&tcp_mib, tcpInSegs, tcpHCInSegs);
+ SYNC32_MIB(&tcp_mib, tcpOutSegs, tcpHCOutSegs);
optp = (struct opthdr *)&mpctl->b_rptr[sizeof (struct T_optmgmt_ack)];
optp->level = MIB2_TCP;
optp->name = 0;
@@ -18773,7 +18790,11 @@ tcp_send_data(tcp_t *tcp, queue_t *q, mblk_t *mp)
UPDATE_OB_PKT_COUNT(ire);
ire->ire_last_used_time = lbolt;
- BUMP_MIB(&ip_mib, ipOutRequests);
+
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutRequests);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutTransmits);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutOctets,
+ ntohs(ipha->ipha_length));
if (ILL_DLS_CAPABLE(ill)) {
/*
@@ -20523,11 +20544,12 @@ tcp_multisend_data(tcp_t *tcp, ire_t *ire, const ill_t *ill, mblk_t *md_mp_head,
if (tcp->tcp_ipversion == IPV4_VERSION) {
TCP_STAT_UPDATE(tcp_mdt_pkt_out_v4, obsegs);
- UPDATE_MIB(&ip_mib, ipOutRequests, obsegs);
} else {
TCP_STAT_UPDATE(tcp_mdt_pkt_out_v6, obsegs);
- UPDATE_MIB(&ip6_mib, ipv6OutRequests, obsegs);
}
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutRequests, obsegs);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutTransmits, obsegs);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutOctets, obbytes);
ire->ire_ob_pkt_count += obsegs;
if (ire->ire_ipif != NULL)
@@ -20692,7 +20714,10 @@ tcp_lsosend_data(tcp_t *tcp, mblk_t *mp, ire_t *ire, ill_t *ill, const int mss,
UPDATE_OB_PKT_COUNT(ire);
ire->ire_last_used_time = lbolt;
- BUMP_MIB(&ip_mib, ipOutRequests);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutRequests);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutTransmits);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutOctets,
+ ntohs(ipha->ipha_length));
if (ILL_DLS_CAPABLE(ill)) {
/*
@@ -22221,7 +22246,7 @@ tcp_xmit_early_reset(char *str, mblk_t *mp, uint32_t seq,
if (ipha->ipha_src == 0 || ipha->ipha_src == INADDR_BROADCAST ||
CLASSD(ipha->ipha_src)) {
freemsg(ipsec_mp);
- BUMP_MIB(&ip_mib, ipInDiscards);
+ BUMP_MIB(&ip_mib, ipIfStatsInDiscards);
return;
}
} else {
@@ -22230,7 +22255,7 @@ tcp_xmit_early_reset(char *str, mblk_t *mp, uint32_t seq,
if (IN6_IS_ADDR_UNSPECIFIED(&ip6h->ip6_src) ||
IN6_IS_ADDR_MULTICAST(&ip6h->ip6_src)) {
freemsg(ipsec_mp);
- BUMP_MIB(&ip6_mib, ipv6InDiscards);
+ BUMP_MIB(&ip6_mib, ipIfStatsInDiscards);
return;
}
@@ -25657,8 +25682,8 @@ tcp_kstat_init(void)
{ "attemptFails", KSTAT_DATA_UINT32, 0 },
{ "estabResets", KSTAT_DATA_UINT32, 0 },
{ "currEstab", KSTAT_DATA_UINT32, 0 },
- { "inSegs", KSTAT_DATA_UINT32, 0 },
- { "outSegs", KSTAT_DATA_UINT32, 0 },
+ { "inSegs", KSTAT_DATA_UINT64, 0 },
+ { "outSegs", KSTAT_DATA_UINT64, 0 },
{ "retransSegs", KSTAT_DATA_UINT32, 0 },
{ "connTableSize", KSTAT_DATA_INT32, 0 },
{ "outRsts", KSTAT_DATA_UINT32, 0 },
@@ -25769,8 +25794,8 @@ tcp_kstat_update(kstat_t *kp, int rw)
tcpkp->passiveOpens.value.ui32 = tcp_mib.tcpPassiveOpens;
tcpkp->attemptFails.value.ui32 = tcp_mib.tcpAttemptFails;
tcpkp->estabResets.value.ui32 = tcp_mib.tcpEstabResets;
- tcpkp->inSegs.value.ui32 = tcp_mib.tcpInSegs;
- tcpkp->outSegs.value.ui32 = tcp_mib.tcpOutSegs;
+ tcpkp->inSegs.value.ui64 = tcp_mib.tcpHCInSegs;
+ tcpkp->outSegs.value.ui64 = tcp_mib.tcpHCOutSegs;
tcpkp->retransSegs.value.ui32 = tcp_mib.tcpRetransSegs;
tcpkp->connTableSize.value.i32 = tcp_mib.tcpConnTableSize;
tcpkp->outRsts.value.ui32 = tcp_mib.tcpOutRsts;
diff --git a/usr/src/uts/common/inet/udp/udp.c b/usr/src/uts/common/inet/udp/udp.c
index d89c1d8e13..2470df6a6a 100644
--- a/usr/src/uts/common/inet/udp/udp.c
+++ b/usr/src/uts/common/inet/udp/udp.c
@@ -2971,6 +2971,9 @@ udp_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
connp->conn_multicast_loop = IP_DEFAULT_MULTICAST_LOOP;
connp->conn_zoneid = zoneid;
+ udp->udp_open_time = lbolt64;
+ udp->udp_open_pid = curproc->p_pid;
+
/*
* If the caller has the process-wide flag set, then default to MAC
* exempt mode. This allows read-down to unlabeled hosts.
@@ -5155,7 +5158,7 @@ udp_input(conn_t *connp, mblk_t *mp)
/* No IP_RECVDSTADDR for IPv6. */
}
- BUMP_MIB(&udp_mib, udpInDatagrams);
+ BUMP_MIB(&udp_mib, udpHCInDatagrams);
TRACE_2(TR_FAC_UDP, TR_UDP_RPUT_END,
"udp_rput_end: q %p (%S)", q, "end");
if (options_mp != NULL)
@@ -5568,7 +5571,7 @@ udp_rput_other(queue_t *q, mblk_t *mp)
ASSERT(udi_size == 0); /* "Consumed" all of allocated space */
}
- BUMP_MIB(&udp_mib, udpInDatagrams);
+ BUMP_MIB(&udp_mib, udpHCInDatagrams);
TRACE_2(TR_FAC_UDP, TR_UDP_RPUT_END,
"udp_rput_other_end: q %p (%S)", q, "end");
if (options_mp != NULL)
@@ -5757,6 +5760,10 @@ udp_snmp_get(queue_t *q, mblk_t *mpctl)
/* fixed length structure for IPv4 and IPv6 counters */
SET_MIB(udp_mib.udpEntrySize, sizeof (mib2_udpEntry_t));
SET_MIB(udp_mib.udp6EntrySize, sizeof (mib2_udp6Entry_t));
+ /* synchronize 64- and 32-bit counters */
+ SYNC32_MIB(&udp_mib, udpInDatagrams, udpHCInDatagrams);
+ SYNC32_MIB(&udp_mib, udpOutDatagrams, udpHCOutDatagrams);
+
optp = (struct opthdr *)&mpctl->b_rptr[sizeof (struct T_optmgmt_ack)];
optp->level = MIB2_UDP;
optp->name = 0;
@@ -5837,6 +5844,19 @@ udp_snmp_get(queue_t *q, mblk_t *mpctl)
ude.udpEntryInfo.ue_RemoteAddress = 0;
ude.udpEntryInfo.ue_RemotePort = 0;
}
+
+ /*
+ * We make the assumption that all udp_t
+ * structs will be created within an address
+ * region no larger than 32-bits.
+ */
+ ude.udpInstance = (uint32_t)(uintptr_t)udp;
+ ude.udpCreationProcess =
+ (udp->udp_open_pid < 0) ?
+ MIB2_UNKNOWN_PROCESS :
+ udp->udp_open_pid;
+ ude.udpCreationTime = udp->udp_open_time;
+
(void) snmp_append_data2(mp_conn_ctl->b_cont,
&mp_conn_tail, (char *)&ude, sizeof (ude));
mlp.tme_connidx = v4_conn_idx++;
@@ -5860,6 +5880,18 @@ udp_snmp_get(queue_t *q, mblk_t *mpctl)
sin6_null.sin6_addr;
ude6.udp6EntryInfo.ue_RemotePort = 0;
}
+ /*
+ * We make the assumption that all udp_t
+ * structs will be created within an address
+ * region no larger than 32-bits.
+ */
+ ude6.udp6Instance = (uint32_t)(uintptr_t)udp;
+ ude6.udp6CreationProcess =
+ (udp->udp_open_pid < 0) ?
+ MIB2_UNKNOWN_PROCESS :
+ udp->udp_open_pid;
+ ude6.udp6CreationTime = udp->udp_open_time;
+
(void) snmp_append_data2(mp6_conn_ctl->b_cont,
&mp6_conn_tail, (char *)&ude6,
sizeof (ude6));
@@ -6460,7 +6492,7 @@ udp_output_v4(conn_t *connp, mblk_t *mp, ipaddr_t v4dst, uint16_t port,
mp = NULL;
/* We're done. Pass the packet to ip. */
- BUMP_MIB(&udp_mib, udpOutDatagrams);
+ BUMP_MIB(&udp_mib, udpHCOutDatagrams);
TRACE_2(TR_FAC_UDP, TR_UDP_WPUT_END,
"udp_wput_end: q %p (%S)", q, "end");
@@ -6617,11 +6649,11 @@ udp_send_data(udp_t *udp, queue_t *q, mblk_t *mp, ipha_t *ipha)
return;
}
- BUMP_MIB(&ip_mib, ipOutRequests);
-
ill = ire_to_ill(ire);
ASSERT(ill != NULL);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutRequests);
+
dev_q = ire->ire_stq->q_next;
ASSERT(dev_q != NULL);
/*
@@ -6633,7 +6665,7 @@ udp_send_data(udp_t *udp, queue_t *q, mblk_t *mp, ipha_t *ipha)
if (ip_output_queue) {
(void) putq(q, mp);
} else {
- BUMP_MIB(&ip_mib, ipOutDiscards);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsOutDiscards);
freemsg(mp);
}
if (ipif != NULL)
@@ -6717,6 +6749,10 @@ udp_send_data(udp_t *udp, queue_t *q, mblk_t *mp, ipha_t *ipha)
UPDATE_OB_PKT_COUNT(ire);
ire->ire_last_used_time = lbolt;
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsHCOutTransmits);
+ UPDATE_MIB(ill->ill_ip_mib, ipIfStatsHCOutOctets,
+ ntohs(ipha->ipha_length));
+
if (ILL_DLS_CAPABLE(ill)) {
/*
* Send the packet directly to DLD, where it may be queued
@@ -7660,7 +7696,7 @@ no_options:
mp = NULL;
/* We're done. Pass the packet to IP */
- BUMP_MIB(&udp_mib, udpOutDatagrams);
+ BUMP_MIB(&udp_mib, udpHCOutDatagrams);
ip_output_v6(connp, mp1, q, IP_WPUT);
done:
@@ -8154,9 +8190,9 @@ static void
udp_kstat_init(void)
{
udp_named_kstat_t template = {
- { "inDatagrams", KSTAT_DATA_UINT32, 0 },
+ { "inDatagrams", KSTAT_DATA_UINT64, 0 },
{ "inErrors", KSTAT_DATA_UINT32, 0 },
- { "outDatagrams", KSTAT_DATA_UINT32, 0 },
+ { "outDatagrams", KSTAT_DATA_UINT64, 0 },
{ "entrySize", KSTAT_DATA_INT32, 0 },
{ "entry6Size", KSTAT_DATA_INT32, 0 },
{ "outErrors", KSTAT_DATA_UINT32, 0 },
@@ -8212,10 +8248,10 @@ udp_kstat_update(kstat_t *kp, int rw)
udpkp = (udp_named_kstat_t *)kp->ks_data;
- udpkp->inDatagrams.value.ui32 = udp_mib.udpInDatagrams;
- udpkp->inErrors.value.ui32 = udp_mib.udpInErrors;
- udpkp->outDatagrams.value.ui32 = udp_mib.udpOutDatagrams;
- udpkp->outErrors.value.ui32 = udp_mib.udpOutErrors;
+ udpkp->inDatagrams.value.ui64 = udp_mib.udpHCInDatagrams;
+ udpkp->inErrors.value.ui32 = udp_mib.udpInErrors;
+ udpkp->outDatagrams.value.ui64 = udp_mib.udpHCOutDatagrams;
+ udpkp->outErrors.value.ui32 = udp_mib.udpOutErrors;
return (0);
}
diff --git a/usr/src/uts/common/inet/udp_impl.h b/usr/src/uts/common/inet/udp_impl.h
index e5bb291a3f..db6506f4c2 100644
--- a/usr/src/uts/common/inet/udp_impl.h
+++ b/usr/src/uts/common/inet/udp_impl.h
@@ -152,6 +152,9 @@ typedef struct udp_s {
uint_t udp_label_len; /* length of security label */
uint_t udp_label_len_v6; /* len of v6 security label */
in6_addr_t udp_v6lastdst; /* most recent destination */
+
+ uint64_t udp_open_time; /* time when this was opened */
+ pid_t udp_open_pid; /* process id when this was opened */
} udp_t;
/* UDP Protocol header */