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