1*4e4dc6dbSJakub Kicinski // SPDX-License-Identifier: GPL-2.0 2*4e4dc6dbSJakub Kicinski #include <stdio.h> 3*4e4dc6dbSJakub Kicinski #include <string.h> 4*4e4dc6dbSJakub Kicinski 5*4e4dc6dbSJakub Kicinski #include <ynl.h> 6*4e4dc6dbSJakub Kicinski 7*4e4dc6dbSJakub Kicinski #include <net/if.h> 8*4e4dc6dbSJakub Kicinski 9*4e4dc6dbSJakub Kicinski #include "tc-user.h" 10*4e4dc6dbSJakub Kicinski 11*4e4dc6dbSJakub Kicinski static void tc_qdisc_print(struct tc_getqdisc_rsp *q) 12*4e4dc6dbSJakub Kicinski { 13*4e4dc6dbSJakub Kicinski char ifname[IF_NAMESIZE]; 14*4e4dc6dbSJakub Kicinski const char *name; 15*4e4dc6dbSJakub Kicinski 16*4e4dc6dbSJakub Kicinski name = if_indextoname(q->_hdr.tcm_ifindex, ifname); 17*4e4dc6dbSJakub Kicinski if (name) 18*4e4dc6dbSJakub Kicinski printf("%16s: ", name); 19*4e4dc6dbSJakub Kicinski 20*4e4dc6dbSJakub Kicinski if (q->_len.kind) { 21*4e4dc6dbSJakub Kicinski printf("%s ", q->kind); 22*4e4dc6dbSJakub Kicinski 23*4e4dc6dbSJakub Kicinski if (q->options._present.fq_codel) { 24*4e4dc6dbSJakub Kicinski struct tc_fq_codel_attrs *fq_codel; 25*4e4dc6dbSJakub Kicinski struct tc_fq_codel_xstats *stats; 26*4e4dc6dbSJakub Kicinski 27*4e4dc6dbSJakub Kicinski fq_codel = &q->options.fq_codel; 28*4e4dc6dbSJakub Kicinski stats = q->stats2.app.fq_codel; 29*4e4dc6dbSJakub Kicinski 30*4e4dc6dbSJakub Kicinski if (fq_codel->_present.limit) 31*4e4dc6dbSJakub Kicinski printf("limit: %dp ", fq_codel->limit); 32*4e4dc6dbSJakub Kicinski if (fq_codel->_present.target) 33*4e4dc6dbSJakub Kicinski printf("target: %dms ", 34*4e4dc6dbSJakub Kicinski (fq_codel->target + 500) / 1000); 35*4e4dc6dbSJakub Kicinski if (q->stats2.app._len.fq_codel) 36*4e4dc6dbSJakub Kicinski printf("new_flow_cnt: %d ", 37*4e4dc6dbSJakub Kicinski stats->qdisc_stats.new_flow_count); 38*4e4dc6dbSJakub Kicinski } 39*4e4dc6dbSJakub Kicinski } 40*4e4dc6dbSJakub Kicinski 41*4e4dc6dbSJakub Kicinski printf("\n"); 42*4e4dc6dbSJakub Kicinski } 43*4e4dc6dbSJakub Kicinski 44*4e4dc6dbSJakub Kicinski int main(int argc, char **argv) 45*4e4dc6dbSJakub Kicinski { 46*4e4dc6dbSJakub Kicinski struct tc_getqdisc_req_dump *req; 47*4e4dc6dbSJakub Kicinski struct tc_getqdisc_list *rsp; 48*4e4dc6dbSJakub Kicinski struct ynl_error yerr; 49*4e4dc6dbSJakub Kicinski struct ynl_sock *ys; 50*4e4dc6dbSJakub Kicinski 51*4e4dc6dbSJakub Kicinski ys = ynl_sock_create(&ynl_tc_family, &yerr); 52*4e4dc6dbSJakub Kicinski if (!ys) { 53*4e4dc6dbSJakub Kicinski fprintf(stderr, "YNL: %s\n", yerr.msg); 54*4e4dc6dbSJakub Kicinski return 1; 55*4e4dc6dbSJakub Kicinski } 56*4e4dc6dbSJakub Kicinski 57*4e4dc6dbSJakub Kicinski req = tc_getqdisc_req_dump_alloc(); 58*4e4dc6dbSJakub Kicinski if (!req) 59*4e4dc6dbSJakub Kicinski goto err_destroy; 60*4e4dc6dbSJakub Kicinski 61*4e4dc6dbSJakub Kicinski rsp = tc_getqdisc_dump(ys, req); 62*4e4dc6dbSJakub Kicinski tc_getqdisc_req_dump_free(req); 63*4e4dc6dbSJakub Kicinski if (!rsp) 64*4e4dc6dbSJakub Kicinski goto err_close; 65*4e4dc6dbSJakub Kicinski 66*4e4dc6dbSJakub Kicinski if (ynl_dump_empty(rsp)) 67*4e4dc6dbSJakub Kicinski fprintf(stderr, "Error: no addresses reported\n"); 68*4e4dc6dbSJakub Kicinski ynl_dump_foreach(rsp, qdisc) 69*4e4dc6dbSJakub Kicinski tc_qdisc_print(qdisc); 70*4e4dc6dbSJakub Kicinski tc_getqdisc_list_free(rsp); 71*4e4dc6dbSJakub Kicinski 72*4e4dc6dbSJakub Kicinski ynl_sock_destroy(ys); 73*4e4dc6dbSJakub Kicinski return 0; 74*4e4dc6dbSJakub Kicinski 75*4e4dc6dbSJakub Kicinski err_close: 76*4e4dc6dbSJakub Kicinski fprintf(stderr, "YNL: %s\n", ys->err.msg); 77*4e4dc6dbSJakub Kicinski err_destroy: 78*4e4dc6dbSJakub Kicinski ynl_sock_destroy(ys); 79*4e4dc6dbSJakub Kicinski return 2; 80*4e4dc6dbSJakub Kicinski } 81