diff options
author | apersson <none@none> | 2006-12-19 17:33:00 -0800 |
---|---|---|
committer | apersson <none@none> | 2006-12-19 17:33:00 -0800 |
commit | 3173664e967186de0a5f0e61548c25996fa6d37f (patch) | |
tree | 8ecbca3fbb92ed52c2102d0d7a21302f61ae09d1 /usr/src | |
parent | 2568f901e23df0fb67939d5e72ef503eca7376d7 (diff) | |
download | illumos-joyent-3173664e967186de0a5f0e61548c25996fa6d37f.tar.gz |
PSARC 2006/314 Updated MIBs
6501024 Add support for new IP/TCP/UDP MIBs
Diffstat (limited to 'usr/src')
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 */ |