summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/ip/ip_if.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/inet/ip/ip_if.c')
-rw-r--r--usr/src/uts/common/inet/ip/ip_if.c104
1 files changed, 75 insertions, 29 deletions
diff --git a/usr/src/uts/common/inet/ip/ip_if.c b/usr/src/uts/common/inet/ip/ip_if.c
index cd40a7e91d..3ba060607a 100644
--- a/usr/src/uts/common/inet/ip/ip_if.c
+++ b/usr/src/uts/common/inet/ip/ip_if.c
@@ -82,6 +82,7 @@
#include <inet/tun.h>
#include <inet/sctp_ip.h>
#include <inet/ip_netinfo.h>
+#include <inet/mib2.h>
#include <net/pfkeyv2.h>
#include <inet/ipsec_info.h>
@@ -392,9 +393,9 @@ static areq_t ip_areq_template = {
0, /* flags */
sizeof (areq_t) + IP_ADDR_LEN, /* sender addr offset */
IP_ADDR_LEN, /* sender addr length */
- 6, /* xmit_count */
- 1000, /* (re)xmit_interval in milliseconds */
- 4 /* max # of requests to buffer */
+ AR_EQ_DEFAULT_XMIT_COUNT, /* xmit_count */
+ AR_EQ_DEFAULT_XMIT_INTERVAL, /* (re)xmit_interval in milliseconds */
+ AR_EQ_DEFAULT_MAX_BUFFERED /* max # of requests to buffer */
/* anything else filled in by the code */
};
@@ -580,35 +581,73 @@ ipif_rand(void)
}
/*
- * Allocate per-interface mibs. Only used for ipv6.
+ * Allocate per-interface mibs.
* Returns true if ok. False otherwise.
* ipsq may not yet be allocated (loopback case ).
*/
static boolean_t
ill_allocate_mibs(ill_t *ill)
{
- ASSERT(ill->ill_isv6);
-
/* Already allocated? */
- if (ill->ill_ip6_mib != NULL) {
- ASSERT(ill->ill_icmp6_mib != NULL);
+ if (ill->ill_ip_mib != NULL) {
+ if (ill->ill_isv6)
+ ASSERT(ill->ill_icmp6_mib != NULL);
return (B_TRUE);
}
- ill->ill_ip6_mib = kmem_zalloc(sizeof (*ill->ill_ip6_mib),
+ ill->ill_ip_mib = kmem_zalloc(sizeof (*ill->ill_ip_mib),
KM_NOSLEEP);
- if (ill->ill_ip6_mib == NULL) {
+ if (ill->ill_ip_mib == NULL) {
return (B_FALSE);
}
+
+ /* Setup static information */
+ SET_MIB(ill->ill_ip_mib->ipIfStatsEntrySize,
+ sizeof (mib2_ipIfStatsEntry_t));
+ if (ill->ill_isv6) {
+ ill->ill_ip_mib->ipIfStatsIPVersion = MIB2_INETADDRESSTYPE_ipv6;
+ SET_MIB(ill->ill_ip_mib->ipIfStatsAddrEntrySize,
+ sizeof (mib2_ipv6AddrEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsRouteEntrySize,
+ sizeof (mib2_ipv6RouteEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsNetToMediaEntrySize,
+ sizeof (mib2_ipv6NetToMediaEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsMemberEntrySize,
+ sizeof (ipv6_member_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsGroupSourceEntrySize,
+ sizeof (ipv6_grpsrc_t));
+ } else {
+ ill->ill_ip_mib->ipIfStatsIPVersion = MIB2_INETADDRESSTYPE_ipv4;
+ SET_MIB(ill->ill_ip_mib->ipIfStatsAddrEntrySize,
+ sizeof (mib2_ipAddrEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsRouteEntrySize,
+ sizeof (mib2_ipRouteEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsNetToMediaEntrySize,
+ sizeof (mib2_ipNetToMediaEntry_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsMemberEntrySize,
+ sizeof (ip_member_t));
+ SET_MIB(ill->ill_ip_mib->ipIfStatsGroupSourceEntrySize,
+ sizeof (ip_grpsrc_t));
+
+ /*
+ * For a v4 ill, we are done at this point, because per ill
+ * icmp mibs are only used for v6.
+ */
+ return (B_TRUE);
+ }
+
ill->ill_icmp6_mib = kmem_zalloc(sizeof (*ill->ill_icmp6_mib),
KM_NOSLEEP);
if (ill->ill_icmp6_mib == NULL) {
- kmem_free(ill->ill_ip6_mib, sizeof (*ill->ill_ip6_mib));
- ill->ill_ip6_mib = NULL;
+ kmem_free(ill->ill_ip_mib, sizeof (*ill->ill_ip_mib));
+ ill->ill_ip_mib = NULL;
return (B_FALSE);
}
+ /* static icmp info */
+ ill->ill_icmp6_mib->ipv6IfIcmpEntrySize =
+ sizeof (mib2_ipv6IfIcmpEntry_t);
/*
- * The ipv6Ifindex and ipv6IfIcmpIndex will be assigned later
+ * The ipIfStatsIfindex and ipv6IfIcmpIndex will be assigned later
* after the phyint merge occurs in ipif_set_values -> ill_glist_insert
* -> ill_phyint_reinit
*/
@@ -978,11 +1017,22 @@ ill_delete_tail(ill_t *ill)
static void
ill_free_mib(ill_t *ill)
{
- if (ill->ill_ip6_mib != NULL) {
- kmem_free(ill->ill_ip6_mib, sizeof (*ill->ill_ip6_mib));
- ill->ill_ip6_mib = NULL;
+ /*
+ * MIB statistics must not be lost, so when an interface
+ * goes away the counter values will be added to the global
+ * MIBs.
+ */
+ if (ill->ill_ip_mib != NULL) {
+ if (ill->ill_isv6)
+ ip_mib2_add_ip_stats(&ip6_mib, ill->ill_ip_mib);
+ else
+ ip_mib2_add_ip_stats(&ip_mib, ill->ill_ip_mib);
+
+ kmem_free(ill->ill_ip_mib, sizeof (*ill->ill_ip_mib));
+ ill->ill_ip_mib = NULL;
}
if (ill->ill_icmp6_mib != NULL) {
+ ip_mib2_add_icmp6_stats(&icmp6_mib, ill->ill_icmp6_mib);
kmem_free(ill->ill_icmp6_mib, sizeof (*ill->ill_icmp6_mib));
ill->ill_icmp6_mib = NULL;
}
@@ -3766,7 +3816,6 @@ ill_frag_timeout(ill_t *ill, time_t dead_interval)
* the icmp messages after we have dropped the lock.
*/
if (ill->ill_isv6) {
- BUMP_MIB(ill->ill_ip6_mib, ipv6ReasmFails);
if (hdr_length != 0) {
mp->b_next = send_icmp_head_v6;
send_icmp_head_v6 = mp;
@@ -3774,7 +3823,6 @@ ill_frag_timeout(ill_t *ill, time_t dead_interval)
freemsg(mp);
}
} else {
- BUMP_MIB(&ip_mib, ipReasmFails);
if (hdr_length != 0) {
mp->b_next = send_icmp_head;
send_icmp_head = mp;
@@ -3782,6 +3830,7 @@ ill_frag_timeout(ill_t *ill, time_t dead_interval)
freemsg(mp);
}
}
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmFails);
freeb(ipf->ipf_mp);
}
mutex_exit(&ipfb->ipfb_lock);
@@ -3950,7 +3999,7 @@ ill_frag_free_pkts(ill_t *ill, ipfb_t *ipfb, ipf_t *ipf, int free_cnt)
ASSERT(ipfb->ipfb_frag_pkts > 0);
ipfb->ipfb_frag_pkts--;
freemsg(mp);
- BUMP_MIB(&ip_mib, ipReasmFails);
+ BUMP_MIB(ill->ill_ip_mib, ipIfStatsReasmFails);
}
if (ipf)
@@ -5058,11 +5107,11 @@ ill_lookup_on_name(char *name, boolean_t do_alloc, boolean_t isv6,
if (isv6) {
ill->ill_isv6 = B_TRUE;
ill->ill_max_frag += IPV6_HDR_LEN + 20; /* for TCP */
- if (!ill_allocate_mibs(ill))
- goto done;
} else {
ill->ill_max_frag += IP_SIMPLE_HDR_LENGTH + 20;
}
+ if (!ill_allocate_mibs(ill))
+ goto done;
ill->ill_max_mtu = ill->ill_max_frag;
/*
* ipif_loopback_name can't be pointed at directly because its used
@@ -22540,9 +22589,9 @@ ill_phyint_reinit(ill_t *ill)
* Now that the phyint's ifindex has been assigned, complete the
* remaining
*/
+
+ ill->ill_ip_mib->ipIfStatsIfIndex = ill->ill_phyint->phyint_ifindex;
if (ill->ill_isv6) {
- ill->ill_ip6_mib->ipv6IfIndex =
- ill->ill_phyint->phyint_ifindex;
ill->ill_icmp6_mib->ipv6IfIcmpIfIndex =
ill->ill_phyint->phyint_ifindex;
}
@@ -22843,14 +22892,11 @@ ipif_set_values(queue_t *q, mblk_t *mp, char *interf_name, uint_t *new_ppa_ptr)
ASSERT(ill->ill_phyint != NULL);
/*
- * The ipv6Ifindex and ipv6IfIcmpIfIndex assignments will
+ * The ipIfStatsIfindex and ipv6IfIcmpIfIndex assignments will
* be completed in ill_glist_insert -> ill_phyint_reinit
*/
- if (ill->ill_isv6) {
- /* allocate v6 mib */
- if (!ill_allocate_mibs(ill))
- return (ENOMEM);
- }
+ if (!ill_allocate_mibs(ill))
+ return (ENOMEM);
/*
* Pick a default sap until we get the DL_INFO_ACK back from