xref: /f-stack/tools/traffic/traffic.c (revision 93240043)
103df98deSfengbojiang #include<unistd.h>
203df98deSfengbojiang #include "ff_ipc.h"
303df98deSfengbojiang 
403df98deSfengbojiang void
usage(void)503df98deSfengbojiang usage(void)
603df98deSfengbojiang {
703df98deSfengbojiang     printf("Usage:\n");
80ee399c9Sfengbojiang     printf("  top [-p <f-stack proc_id>] [-P <max proc_id>] "
90ee399c9Sfengbojiang         "[-d <secs>] [-n num] [-s]\n");
1003df98deSfengbojiang }
1103df98deSfengbojiang 
traffic_status(struct ff_traffic_args * traffic)1203df98deSfengbojiang int traffic_status(struct ff_traffic_args *traffic)
1303df98deSfengbojiang {
1403df98deSfengbojiang     int            ret;
1503df98deSfengbojiang     struct ff_msg *msg, *retmsg = NULL;
1603df98deSfengbojiang 
1703df98deSfengbojiang     msg = ff_ipc_msg_alloc();
1803df98deSfengbojiang     if (msg == NULL) {
1903df98deSfengbojiang         errno = ENOMEM;
2003df98deSfengbojiang         return -1;
2103df98deSfengbojiang     }
2203df98deSfengbojiang 
2303df98deSfengbojiang     msg->msg_type = FF_TRAFFIC;
2403df98deSfengbojiang     ret = ff_ipc_send(msg);
2503df98deSfengbojiang     if (ret < 0) {
2603df98deSfengbojiang         errno = EPIPE;
2703df98deSfengbojiang         ff_ipc_msg_free(msg);
2803df98deSfengbojiang         return -1;
2903df98deSfengbojiang     }
3003df98deSfengbojiang 
3103df98deSfengbojiang     do {
3203df98deSfengbojiang         if (retmsg != NULL) {
3303df98deSfengbojiang             ff_ipc_msg_free(retmsg);
3403df98deSfengbojiang         }
3503df98deSfengbojiang 
366194fcd2Sfengbojiang(姜凤波)         ret = ff_ipc_recv(&retmsg, msg->msg_type);
3703df98deSfengbojiang         if (ret < 0) {
3803df98deSfengbojiang             errno = EPIPE;
3903df98deSfengbojiang             return -1;
4003df98deSfengbojiang         }
4103df98deSfengbojiang     } while (msg != retmsg);
4203df98deSfengbojiang 
4303df98deSfengbojiang     *traffic = retmsg->traffic;
4403df98deSfengbojiang 
4503df98deSfengbojiang     ff_ipc_msg_free(msg);
4603df98deSfengbojiang 
4703df98deSfengbojiang     return 0;
4803df98deSfengbojiang }
4903df98deSfengbojiang 
main(int argc,char ** argv)5003df98deSfengbojiang int main(int argc, char **argv)
5103df98deSfengbojiang {
5203df98deSfengbojiang     int ch, delay = 1, n = 0;
5303df98deSfengbojiang     int single = 0;
540ee399c9Sfengbojiang     unsigned int i, j;
550ee399c9Sfengbojiang     struct ff_traffic_args traffic = {0, 0, 0, 0}, otr;
560ee399c9Sfengbojiang     struct ff_traffic_args ptraffic[RTE_MAX_LCORE], potr[RTE_MAX_LCORE];
570ee399c9Sfengbojiang     int proc_id = 0, max_proc_id = -1;
580ee399c9Sfengbojiang     uint64_t rxp, rxb, txp, txb;
590ee399c9Sfengbojiang     uint64_t prxp, prxb, ptxp, ptxb;
60*93240043Sfengbojiang     int title_line = 40;
6103df98deSfengbojiang 
6203df98deSfengbojiang     ff_ipc_init();
6303df98deSfengbojiang 
640ee399c9Sfengbojiang #define DIFF(member) (traffic.member - otr.member)
650ee399c9Sfengbojiang #define DIFF_P(member) (ptraffic[j].member - potr[j].member)
660ee399c9Sfengbojiang #define ADD_S(member) (traffic.member += ptraffic[j].member)
670ee399c9Sfengbojiang 
680ee399c9Sfengbojiang     while ((ch = getopt(argc, argv, "hp:P:d:n:s")) != -1) {
6903df98deSfengbojiang         switch(ch) {
7003df98deSfengbojiang         case 'p':
710ee399c9Sfengbojiang             proc_id = atoi(optarg);
720ee399c9Sfengbojiang             ff_set_proc_id(proc_id);
730ee399c9Sfengbojiang             break;
740ee399c9Sfengbojiang         case 'P':
750ee399c9Sfengbojiang             max_proc_id = atoi(optarg);
760ee399c9Sfengbojiang             if (max_proc_id < 0 || max_proc_id >= RTE_MAX_LCORE) {
770ee399c9Sfengbojiang                 usage();
78552bc48cSroot                 ff_ipc_exit();
790ee399c9Sfengbojiang                 return -1;
800ee399c9Sfengbojiang             }
81*93240043Sfengbojiang             if (max_proc_id > title_line - 2)
82*93240043Sfengbojiang                 title_line = max_proc_id + 2;
8303df98deSfengbojiang             break;
8403df98deSfengbojiang         case 'd':
8503df98deSfengbojiang             delay = atoi(optarg) ?: 1;
8603df98deSfengbojiang             break;
8703df98deSfengbojiang         case 'n':
8803df98deSfengbojiang             n = atoi(optarg);
8903df98deSfengbojiang             break;
9003df98deSfengbojiang         case 's':
9103df98deSfengbojiang             single = 1;
9203df98deSfengbojiang             break;
9303df98deSfengbojiang         case 'h':
9403df98deSfengbojiang         default:
9503df98deSfengbojiang             usage();
96552bc48cSroot             ff_ipc_exit();
9703df98deSfengbojiang             return -1;
9803df98deSfengbojiang         }
9903df98deSfengbojiang     }
10003df98deSfengbojiang 
10103df98deSfengbojiang     if (single) {
1020ee399c9Sfengbojiang         if (max_proc_id == -1) {
10303df98deSfengbojiang             if (traffic_status(&traffic)) {
10403df98deSfengbojiang                 printf("fstack ipc message error !\n");
105552bc48cSroot                 ff_ipc_exit();
10603df98deSfengbojiang                 return -1;
10703df98deSfengbojiang             }
10803df98deSfengbojiang 
10903df98deSfengbojiang             printf("%lu,%lu,%lu,%lu\n", traffic.rx_packets, traffic.rx_bytes,
11003df98deSfengbojiang                 traffic.tx_packets, traffic.tx_bytes);
1110ee399c9Sfengbojiang         } else {
1120ee399c9Sfengbojiang             for (j = proc_id; j <= max_proc_id; j++) {
1130ee399c9Sfengbojiang                 ff_set_proc_id(j);
1140ee399c9Sfengbojiang                 if (traffic_status(&ptraffic[j])) {
1150ee399c9Sfengbojiang                     printf("fstack ipc message error, proc id:%d!\n", j);
116552bc48cSroot                     ff_ipc_exit();
1170ee399c9Sfengbojiang                     return -1;
1180ee399c9Sfengbojiang                 }
1190ee399c9Sfengbojiang 
1200ee399c9Sfengbojiang                 printf("%9d,%20lu,%20lu,%20lu,%20lu,\n",
1210ee399c9Sfengbojiang                     j, ptraffic[j].rx_packets, ptraffic[j].rx_bytes,
1220ee399c9Sfengbojiang                     ptraffic[j].tx_packets, ptraffic[j].tx_bytes);
1230ee399c9Sfengbojiang 
1240ee399c9Sfengbojiang                 ADD_S(rx_packets);
1250ee399c9Sfengbojiang                 ADD_S(rx_bytes);
1260ee399c9Sfengbojiang                 ADD_S(tx_packets);
1270ee399c9Sfengbojiang                 ADD_S(tx_bytes);
1280ee399c9Sfengbojiang             }
1290ee399c9Sfengbojiang 
1300ee399c9Sfengbojiang             printf("%9s,%20lu,%20lu,%20lu,%20lu,\n",
1310ee399c9Sfengbojiang                 "total", traffic.rx_packets, traffic.rx_bytes,
1320ee399c9Sfengbojiang                 traffic.tx_packets, traffic.tx_bytes);
1330ee399c9Sfengbojiang         }
134552bc48cSroot         ff_ipc_exit();
13503df98deSfengbojiang         return 0;
13603df98deSfengbojiang     }
13703df98deSfengbojiang 
13803df98deSfengbojiang     for (i = 0; ; i++) {
1390ee399c9Sfengbojiang         if (max_proc_id == -1) {
14003df98deSfengbojiang             if (traffic_status(&traffic)) {
14103df98deSfengbojiang                 printf("fstack ipc message error !\n");
142552bc48cSroot                 ff_ipc_exit();
14303df98deSfengbojiang                 return -1;
14403df98deSfengbojiang             }
14503df98deSfengbojiang 
146*93240043Sfengbojiang             if (i % title_line == 0) {
14703df98deSfengbojiang                 printf("|--------------------|--------------------|");
14803df98deSfengbojiang                 printf("--------------------|--------------------|\n");
14903df98deSfengbojiang                 printf("|%20s|%20s|%20s|%20s|\n", "rx packets", "rx bytes",
15003df98deSfengbojiang                     "tx packets", "tx bytes");
15103df98deSfengbojiang                 printf("|--------------------|--------------------|");
15203df98deSfengbojiang                 printf("--------------------|--------------------|\n");
15303df98deSfengbojiang             }
15403df98deSfengbojiang 
15503df98deSfengbojiang             if (i) {
1560ee399c9Sfengbojiang                 rxp = DIFF(rx_packets);
1570ee399c9Sfengbojiang                 rxb = DIFF(rx_bytes);
1580ee399c9Sfengbojiang                 txp = DIFF(tx_packets);
1590ee399c9Sfengbojiang                 txb = DIFF(tx_bytes);
16003df98deSfengbojiang 
16103df98deSfengbojiang                 printf("|%20lu|%20lu|%20lu|%20lu|\n", rxp, rxb, txp, txb);
16203df98deSfengbojiang             }
1630ee399c9Sfengbojiang         } else {
1640ee399c9Sfengbojiang             /*
1650ee399c9Sfengbojiang              * get and show traffic from proc_id to max_proc_id.
1660ee399c9Sfengbojiang              */
167*93240043Sfengbojiang             if (i % (title_line / (max_proc_id - proc_id + 2)) == 0) {
1680ee399c9Sfengbojiang                 printf("|---------|--------------------|--------------------|"
1690ee399c9Sfengbojiang                     "--------------------|--------------------|\n");
1700ee399c9Sfengbojiang                 printf("|%9s|%20s|%20s|%20s|%20s|\n",
1710ee399c9Sfengbojiang                     "proc_id", "rx packets", "rx bytes",
1720ee399c9Sfengbojiang                     "tx packets", "tx bytes");
1730ee399c9Sfengbojiang                 printf("|---------|--------------------|--------------------|"
1740ee399c9Sfengbojiang                     "--------------------|--------------------|\n");
1750ee399c9Sfengbojiang             }
1760ee399c9Sfengbojiang 
1770ee399c9Sfengbojiang             rxp = rxb = txp = txb = 0;
1780ee399c9Sfengbojiang             for (j = proc_id; j <= max_proc_id; j++) {
1790ee399c9Sfengbojiang                 potr[j] = ptraffic[j];
1800ee399c9Sfengbojiang 
1810ee399c9Sfengbojiang                 ff_set_proc_id(j);
1820ee399c9Sfengbojiang                 if (traffic_status(&ptraffic[j])) {
1830ee399c9Sfengbojiang                     printf("fstack ipc message error, proc id:%d!\n", j);
184552bc48cSroot                     ff_ipc_exit();
1850ee399c9Sfengbojiang                     return -1;
1860ee399c9Sfengbojiang                 }
1870ee399c9Sfengbojiang 
1880ee399c9Sfengbojiang                 if (i) {
1890ee399c9Sfengbojiang                     prxp = DIFF_P(rx_packets);
1900ee399c9Sfengbojiang                     prxb = DIFF_P(rx_bytes);
1910ee399c9Sfengbojiang                     ptxp = DIFF_P(tx_packets);
1920ee399c9Sfengbojiang                     ptxb = DIFF_P(tx_bytes);
1930ee399c9Sfengbojiang                     printf("|%9d|%20lu|%20lu|%20lu|%20lu|\n",
1940ee399c9Sfengbojiang                         j, prxp, prxb, ptxp, ptxb);
1950ee399c9Sfengbojiang 
1960ee399c9Sfengbojiang                     rxp += prxp;
1970ee399c9Sfengbojiang                     rxb += prxb;
1980ee399c9Sfengbojiang                     txp += ptxp;
1990ee399c9Sfengbojiang                     txb += ptxb;
2000ee399c9Sfengbojiang 
2010ee399c9Sfengbojiang                     if (j == max_proc_id) {
2020ee399c9Sfengbojiang                         printf("|%9s|%20lu|%20lu|%20lu|%20lu|\n",
2030ee399c9Sfengbojiang                             "total", rxp, rxb, txp, txb);
2040ee399c9Sfengbojiang                         printf("|         |                    |"
2050ee399c9Sfengbojiang                             "                    |                    |"
2060ee399c9Sfengbojiang                             "                    |\n");
2070ee399c9Sfengbojiang                     }
2080ee399c9Sfengbojiang                 }
2090ee399c9Sfengbojiang             }
2100ee399c9Sfengbojiang         }
21103df98deSfengbojiang 
21203df98deSfengbojiang         if (n && i >= n) {
21303df98deSfengbojiang             break;
21403df98deSfengbojiang         }
21503df98deSfengbojiang 
21603df98deSfengbojiang         otr = traffic;
21703df98deSfengbojiang         sleep(delay);
21803df98deSfengbojiang     }
21903df98deSfengbojiang 
220552bc48cSroot     ff_ipc_exit();
22103df98deSfengbojiang     return 0;
22203df98deSfengbojiang }
223