summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/ip/ip.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/inet/ip/ip.c')
-rw-r--r--usr/src/uts/common/inet/ip/ip.c1212
1 files changed, 826 insertions, 386 deletions
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.