]> git.saurik.com Git - apple/network_cmds.git/blobdiff - netstat.tproj/if.c
network_cmds-543.260.3.tar.gz
[apple/network_cmds.git] / netstat.tproj / if.c
index 714e6511ba168efb42674bc9fbe8d1d2d9b578cd..5d82d82ef91e74ecca126d9dbf009a8cb67644ae 100644 (file)
@@ -115,6 +115,7 @@ static char *qid2str(unsigned int);
 static char *qstate2str(unsigned int);
 static char *tcqslot2str(unsigned int);
 static char *rate2str(long double);
+static char *pri2str(unsigned int i);
 
 #define AVGN_MAX       8
 
@@ -128,20 +129,14 @@ struct queue_stats {
        unsigned int             handle;
 };
 
-static void print_cbqstats(int slot, struct cbq_classstats *,
-    struct queue_stats *);
-static void print_priqstats(int slot, struct priq_classstats *,
-    struct queue_stats *);
-static void print_hfscstats(int slot, struct hfsc_classstats *,
-    struct queue_stats *);
-static void print_fairqstats(int slot, struct fairq_classstats *,
-    struct queue_stats *);
 static void print_tcqstats(int slot, struct tcq_classstats *,
     struct queue_stats *);
 static void print_qfqstats(int slot, struct qfq_classstats *,
     struct queue_stats *);
 static void print_sfbstats(struct sfb_stats *);
 static void update_avg(struct if_ifclassq_stats *, struct queue_stats *);
+static void print_fq_codel_stats(int slot, struct fq_codel_classstats *,
+    struct queue_stats *);
 
 struct queue_stats qstats[IFCQ_SC_MAX];
 
@@ -1064,6 +1059,8 @@ loop:
                                    sum->ift_fb - total->ift_fb);
                }
                *total = *sum;
+               
+               free(ifmsuppall);
        }
        if (!first)
                putchar('\n');
@@ -1444,22 +1441,6 @@ loop:
                update_avg(ifcqs, &qstats[n]);
 
                switch (scheduler) {
-                       case PKTSCHEDT_CBQ:
-                               print_cbqstats(n, &ifcqs->ifqs_cbq_stats,
-                                   &qstats[n]);
-                               break;
-                       case PKTSCHEDT_HFSC:
-                               print_hfscstats(n, &ifcqs->ifqs_hfsc_stats,
-                                   &qstats[n]);
-                               break;
-                       case PKTSCHEDT_PRIQ:
-                               print_priqstats(n, &ifcqs->ifqs_priq_stats,
-                                   &qstats[n]);
-                               break;
-                       case PKTSCHEDT_FAIRQ:
-                               print_fairqstats(n, &ifcqs->ifqs_fairq_stats,
-                                   &qstats[n]);
-                               break;
                        case PKTSCHEDT_TCQ:
                                print_tcqstats(n, &ifcqs->ifqs_tcq_stats,
                                    &qstats[n]);
@@ -1468,6 +1449,11 @@ loop:
                                print_qfqstats(n, &ifcqs->ifqs_qfq_stats,
                                    &qstats[n]);
                                break;
+                       case PKTSCHEDT_FQ_CODEL:
+                               print_fq_codel_stats(n,
+                                   &ifcqs->ifqs_fq_codel_stats,
+                                   &qstats[n]);
+                               break;
                        case PKTSCHEDT_NONE:
                        default:
                                break;
@@ -1495,131 +1481,6 @@ done:
        close(s);
 }
 
-static void
-print_cbqstats(int slot, struct cbq_classstats *cs, struct queue_stats *qs)
-{
-       printf(" %2d: [ pkts: %10llu  bytes: %10llu  "
-           "dropped pkts: %6llu bytes: %6llu ]\n", slot,
-           (unsigned long long)cs->xmit_cnt.packets,
-           (unsigned long long)cs->xmit_cnt.bytes,
-           (unsigned long long)cs->drop_cnt.packets,
-           (unsigned long long)cs->drop_cnt.bytes);
-       printf("     [ qlength: %3d/%3d  borrows: %6u  "
-           "suspends: %6u  qalg: %s ]\n", cs->qcnt, cs->qmax,
-           cs->borrows, cs->delays, qtype2str(cs->qtype));
-       printf("     [ service class: %5s ]\n", qid2str(cs->handle));
-
-       if (qs->avgn >= 2) {
-               printf("     [ measured: %7.1f packets/s, %s/s ]\n",
-                   qs->avg_packets / interval,
-                   rate2str((8 * qs->avg_bytes) / interval));
-       }
-
-       if (qflag < 2)
-               return;
-
-       switch (cs->qtype) {
-       case Q_SFB:
-               print_sfbstats(&cs->sfb);
-               break;
-       default:
-               break;
-       }
-}
-
-static void
-print_priqstats(int slot, struct priq_classstats *cs, struct queue_stats *qs)
-{
-       printf(" %2d: [ pkts: %10llu  bytes: %10llu  "
-           "dropped pkts: %6llu bytes: %6llu ]\n", slot,
-           (unsigned long long)cs->xmitcnt.packets,
-           (unsigned long long)cs->xmitcnt.bytes,
-           (unsigned long long)cs->dropcnt.packets,
-           (unsigned long long)cs->dropcnt.bytes);
-       printf("     [ qlength: %3d/%3d  qalg: %11s  service class: %5s ]\n",
-            cs->qlength, cs->qlimit, qtype2str(cs->qtype),
-            qid2str(cs->class_handle));
-
-       if (qs->avgn >= 2) {
-               printf("     [ measured: %7.1f packets/s, %s/s ]\n",
-                   qs->avg_packets / interval,
-                   rate2str((8 * qs->avg_bytes) / interval));
-       }
-
-       if (qflag < 2)
-               return;
-
-       switch (cs->qtype) {
-       case Q_SFB:
-               print_sfbstats(&cs->sfb);
-               break;
-       default:
-               break;
-       }
-}
-
-static void
-print_hfscstats(int slot, struct hfsc_classstats *cs, struct queue_stats *qs)
-{
-       printf(" %2d: [ pkts: %10llu  bytes: %10llu  "
-           "dropped pkts: %6llu bytes: %6llu ]\n", slot,
-           (unsigned long long)cs->xmit_cnt.packets,
-           (unsigned long long)cs->xmit_cnt.bytes,
-           (unsigned long long)cs->drop_cnt.packets,
-           (unsigned long long)cs->drop_cnt.bytes);
-       printf("     [ qlength: %3d/%3d  qalg: %11s  service class: %5s ]\n",
-            cs->qlength, cs->qlimit, qtype2str(cs->qtype),
-            qid2str(cs->class_handle));
-
-       if (qs->avgn >= 2) {
-               printf("     [ measured: %7.1f packets/s, %s/s ]\n",
-                   qs->avg_packets / interval,
-                   rate2str((8 * qs->avg_bytes) / interval));
-       }
-
-       if (qflag < 2)
-               return;
-
-       switch (cs->qtype) {
-       case Q_SFB:
-               print_sfbstats(&cs->sfb);
-               break;
-       default:
-               break;
-       }
-}
-
-static void
-print_fairqstats(int slot, struct fairq_classstats *cs, struct queue_stats *qs)
-{
-       printf(" %2d: [ pkts: %10llu  bytes: %10llu  "
-           "dropped pkts: %6llu bytes: %6llu ]\n", slot,
-           (unsigned long long)cs->xmit_cnt.packets,
-           (unsigned long long)cs->xmit_cnt.bytes,
-           (unsigned long long)cs->drop_cnt.packets,
-           (unsigned long long)cs->drop_cnt.bytes);
-       printf("     [ qlength: %3d/%3d  qalg: %11s  service class: %5s ]]\n",
-           cs->qlength, cs->qlimit, qtype2str(cs->qtype),
-           qid2str(cs->class_handle));
-
-       if (qs->avgn >= 2) {
-               printf("     [ measured: %7.1f packets/s, %s/s ]\n",
-                   qs->avg_packets / interval,
-                   rate2str((8 * qs->avg_bytes) / interval));
-       }
-
-       if (qflag < 2)
-               return;
-
-       switch (cs->qtype) {
-       case Q_SFB:
-               print_sfbstats(&cs->sfb);
-               break;
-       default:
-               break;
-       }
-}
-
 static void
 print_tcqstats(int slot, struct tcq_classstats *cs, struct queue_stats *qs)
 {
@@ -1699,6 +1560,70 @@ print_qfqstats(int slot, struct qfq_classstats *cs, struct queue_stats *qs)
        }
 }
 
+static void
+print_fq_codel_stats(int pri, struct fq_codel_classstats *fqst,
+    struct queue_stats *qs)
+{
+       int i = 0;
+
+       if (fqst->fcls_service_class == 0 && fqst->fcls_pri == 0)
+               return;
+       printf("=====================================================\n");
+       printf("     [ pri: %s (%d)\tsrv_cl: 0x%x\tquantum: %d\tdrr_max: %d ]\n",
+           pri2str(fqst->fcls_pri), fqst->fcls_pri,
+           fqst->fcls_service_class, fqst->fcls_quantum,
+           fqst->fcls_drr_max);
+       printf("     [ queued pkts: %llu\tbytes: %llu ]\n",
+           fqst->fcls_pkt_cnt, fqst->fcls_byte_cnt);
+       printf("     [ dequeued pkts: %llu\tbytes: %llu ]\n",
+           fqst->fcls_dequeue, fqst->fcls_dequeue_bytes);
+       printf("     [ budget: %lld\ttarget qdelay: %10s\t",
+           fqst->fcls_budget, nsec_to_str(fqst->fcls_target_qdelay));
+       printf("update interval:%10s ]\n",
+           nsec_to_str(fqst->fcls_update_interval));
+       printf("     [ flow control: %u\tfeedback: %u\tstalls: %u\tfailed: %u ]\n",
+           fqst->fcls_flow_control, fqst->fcls_flow_feedback,
+           fqst->fcls_dequeue_stall, fqst->fcls_flow_control_fail);
+       printf("     [ drop overflow: %llu\tearly: %llu\tmemfail: %u\tduprexmt:%u ]\n",
+           fqst->fcls_drop_overflow, fqst->fcls_drop_early,
+           fqst->fcls_drop_memfailure, fqst->fcls_dup_rexmts);
+       printf("     [ flows total: %u\tnew: %u\told: %u ]\n",
+           fqst->fcls_flows_cnt,
+           fqst->fcls_newflows_cnt, fqst->fcls_oldflows_cnt);
+       printf("     [ throttle on: %u\toff: %u\tdrop: %u ]\n",
+           fqst->fcls_throttle_on, fqst->fcls_throttle_off,
+           fqst->fcls_throttle_drops);
+
+       if (qflag < 2)
+               return;
+
+       if (fqst->fcls_flowstats_cnt > 0) {
+               printf("Flowhash\tBytes\tMin qdelay\tFlags\t\n");
+               for (i = 0; i < fqst->fcls_flowstats_cnt; i++) {
+                       printf("%u\t%u\t%14s\t",
+                           fqst->fcls_flowstats[i].fqst_flowhash,
+                           fqst->fcls_flowstats[i].fqst_bytes,
+                           nsec_to_str(fqst->fcls_flowstats[i].fqst_min_qdelay));
+                       if (fqst->fcls_flowstats[i].fqst_flags &
+                           FQ_FLOWSTATS_OLD_FLOW)
+                               printf("O");
+                       if (fqst->fcls_flowstats[i].fqst_flags &
+                           FQ_FLOWSTATS_NEW_FLOW)
+                               printf("N");
+                       if (fqst->fcls_flowstats[i].fqst_flags &
+                           FQ_FLOWSTATS_LARGE_FLOW)
+                               printf("L");
+                       if (fqst->fcls_flowstats[i].fqst_flags &
+                           FQ_FLOWSTATS_DELAY_HIGH)
+                               printf("D");
+                       if (fqst->fcls_flowstats[i].fqst_flags &
+                           FQ_FLOWSTATS_FLOWCTL_ON)
+                               printf("F");
+                       printf("\n");
+               }
+       }
+}
+
 static void
 print_sfbstats(struct sfb_stats *sfb)
 {
@@ -1784,22 +1709,6 @@ update_avg(struct if_ifclassq_stats *ifcqs, struct queue_stats *qs)
        n = qs->avgn;
 
        switch (ifcqs->ifqs_scheduler) {
-       case PKTSCHEDT_CBQ:
-               b = ifcqs->ifqs_cbq_stats.xmit_cnt.bytes;
-               p = ifcqs->ifqs_cbq_stats.xmit_cnt.packets;
-               break;
-       case PKTSCHEDT_PRIQ:
-               b = ifcqs->ifqs_priq_stats.xmitcnt.bytes;
-               p = ifcqs->ifqs_priq_stats.xmitcnt.packets;
-               break;
-       case PKTSCHEDT_HFSC:
-               b = ifcqs->ifqs_hfsc_stats.xmit_cnt.bytes;
-               p = ifcqs->ifqs_hfsc_stats.xmit_cnt.packets;
-               break;
-       case PKTSCHEDT_FAIRQ:
-               b = ifcqs->ifqs_fairq_stats.xmit_cnt.bytes;
-               p = ifcqs->ifqs_fairq_stats.xmit_cnt.packets;
-               break;
        case PKTSCHEDT_TCQ:
                b = ifcqs->ifqs_tcq_stats.xmitcnt.bytes;
                p = ifcqs->ifqs_tcq_stats.xmitcnt.packets;
@@ -1808,6 +1717,10 @@ update_avg(struct if_ifclassq_stats *ifcqs, struct queue_stats *qs)
                b = ifcqs->ifqs_qfq_stats.xmitcnt.bytes;
                p = ifcqs->ifqs_qfq_stats.xmitcnt.packets;
                break;
+       case PKTSCHEDT_FQ_CODEL:
+               b = ifcqs->ifqs_fq_codel_stats.fcls_dequeue_bytes;
+               p = ifcqs->ifqs_fq_codel_stats.fcls_dequeue;
+               break;
        default:
                b = 0;
                p = 0;
@@ -1847,15 +1760,6 @@ qtype2str(classq_type_t t)
         case Q_DROPTAIL:
                c = "DROPTAIL";
                break;
-        case Q_RED:
-               c = "RED";
-               break;
-        case Q_RIO:
-               c = "RIO";
-               break;
-        case Q_BLUE:
-               c = "BLUE";
-               break;
         case Q_SFB:
                c = "SFB";
                break;
@@ -1868,8 +1772,8 @@ qtype2str(classq_type_t t)
 }
 
 #define NSEC_PER_SEC    1000000000      /* nanoseconds per second */
-#define USEC_PER_SEC    1000000                /* nanoseconds per second */
-#define MSEC_PER_SEC    1000           /* nanoseconds per second */
+#define USEC_PER_SEC    1000000                /* microseconds per second */
+#define MSEC_PER_SEC    1000           /* milliseconds per second */
 
 static char *
 nsec_to_str(unsigned long long nsec)
@@ -1905,24 +1809,15 @@ sched2str(unsigned int s)
        case PKTSCHEDT_NONE:
                c = "NONE";
                break;
-       case PKTSCHEDT_CBQ:
-               c = "CBQ";
-               break;
-       case PKTSCHEDT_HFSC:
-               c = "HFSC";
-               break;
-       case PKTSCHEDT_PRIQ:
-               c = "PRIQ";
-               break;
-       case PKTSCHEDT_FAIRQ:
-               c = "FAIRQ";
-               break;
        case PKTSCHEDT_TCQ:
                c = "TCQ";
                break;
        case PKTSCHEDT_QFQ:
                c = "QFQ";
                break;
+       case PKTSCHEDT_FQ_CODEL:
+               c = "FQ_CODEL";
+               break;
        default:
                c = "UNKNOWN";
                break;
@@ -2007,6 +1902,48 @@ tcqslot2str(unsigned int s)
        return (c);
 }
 
+static char *
+pri2str(unsigned int i)
+{
+       char *c;
+       switch (i) {
+       case 9:
+               c = "BK_SYS";
+               break;
+       case 8:
+               c = "BK";
+               break;
+       case 7:
+               c = "BE";
+               break;
+       case 6:
+               c = "RD";
+               break;
+       case 5:
+               c = "OAM";
+               break;
+       case 4:
+               c = "AV";
+               break;
+       case 3:
+               c = "RV";
+               break;
+       case 2:
+               c = "VI";
+               break;
+       case 1:
+               c = "VO";
+               break;
+       case 0:
+               c = "CTL";
+               break;
+       default:
+               c = "?";
+               break;
+       }
+       return (c);
+}
+
 static char *
 qstate2str(unsigned int s)
 {
@@ -2295,8 +2232,8 @@ rem_nstat_src(int fd, nstat_src_ref_t sref)
        }
 
        if (remrsp->srcref != sref) {
-               fprintf(stderr, "%s: received invalid srcref, received %u "
-                       "expected %u\n", __func__, remrsp->srcref, sref);
+               fprintf(stderr, "%s: received invalid srcref, received %llu "
+                       "expected %llu\n", __func__, remrsp->srcref, sref);
        }
        return 0;
 }
@@ -2352,7 +2289,7 @@ get_src_decsription(int fd, nstat_src_ref_t srcref,
        if (drsp->srcref != srcref)
        {
                fprintf(stderr, "%s: received message for wrong source, "
-                       "received 0x%x expected 0x%x\n",
+                       "received 0x%llx expected 0x%llx\n",
                        __func__, drsp->srcref, srcref);
                return -1;
        }
@@ -2427,7 +2364,7 @@ print_wifi_status(nstat_ifnet_desc_wifi_status *status)
 static void
 print_cellular_status(nstat_ifnet_desc_cellular_status *status)
 {
-       int tmp;
+       int tmp, tmp_mss;
 #define val(x, f)      \
        ((status->valid_bitmask & NSTAT_IFNET_DESC_CELL_ ## f ## _VALID) ?\
         status->x : -1)
@@ -2439,6 +2376,12 @@ print_cellular_status(nstat_ifnet_desc_cellular_status *status)
        ((tmp == NSTAT_IFNET_DESC_CELL_UL_RETXT_LEVEL_MEDIUM) ? "(medium)" : \
        ((tmp == NSTAT_IFNET_DESC_CELL_UL_RETXT_LEVEL_HIGH) ? "(high)" : \
        "(?)")))))
+#define pretxtm(n, un) \
+       (((tmp_mss = val(n,un)) == -1) ? "(not valid)" : \
+       ((tmp_mss == NSTAT_IFNET_DESC_MSS_RECOMMENDED_NONE) ? "(none)" : \
+       ((tmp_mss == NSTAT_IFNET_DESC_MSS_RECOMMENDED_MEDIUM) ? "(medium)" : \
+       ((tmp_mss == NSTAT_IFNET_DESC_MSS_RECOMMENDED_LOW) ? "(low)" : \
+       "(?)"))))
 
        printf("\ncellular status:\n");
        printf(
@@ -2456,7 +2399,8 @@ print_cellular_status(nstat_ifnet_desc_cellular_status *status)
            "\t%s:\t%d\n"
            "\t%s:\t%d\n"
            "\t%s:\t%d\n"
-           "\t%s:\t%d\n",
+           "\t%s:\t%d\n"
+           "\t%s:\t%d %s\n",
            parg(link_quality_metric, LINK_QUALITY_METRIC),
            parg(ul_effective_bandwidth, UL_EFFECTIVE_BANDWIDTH),
            parg(ul_max_bandwidth, UL_MAX_BANDWIDTH),
@@ -2472,7 +2416,9 @@ print_cellular_status(nstat_ifnet_desc_cellular_status *status)
            parg(dl_effective_bandwidth, DL_EFFECTIVE_BANDWIDTH),
            parg(dl_max_bandwidth, DL_MAX_BANDWIDTH),
            parg(config_inactivity_time, CONFIG_INACTIVITY_TIME),
-           parg(config_backoff_time, CONFIG_BACKOFF_TIME)
+           parg(config_backoff_time, CONFIG_BACKOFF_TIME),
+           parg(mss_recommended, MSS_RECOMMENDED),
+           pretxtm(mss_recommended, MSS_RECOMMENDED)
            );
 #undef pretxtl
 #undef parg