1 #include<unistd.h> 2 #include "ff_ipc.h" 3 4 void 5 usage(void) 6 { 7 printf("Usage:\n"); 8 printf(" top [-p <f-stack proc_id>] [-P <max proc_id>] " 9 "[-d <secs>] [-n num] [-s]\n"); 10 } 11 12 int traffic_status(struct ff_traffic_args *traffic) 13 { 14 int ret; 15 struct ff_msg *msg, *retmsg = NULL; 16 17 msg = ff_ipc_msg_alloc(); 18 if (msg == NULL) { 19 errno = ENOMEM; 20 return -1; 21 } 22 23 msg->msg_type = FF_TRAFFIC; 24 ret = ff_ipc_send(msg); 25 if (ret < 0) { 26 errno = EPIPE; 27 ff_ipc_msg_free(msg); 28 return -1; 29 } 30 31 do { 32 if (retmsg != NULL) { 33 ff_ipc_msg_free(retmsg); 34 } 35 36 ret = ff_ipc_recv(&retmsg, msg->msg_type); 37 if (ret < 0) { 38 errno = EPIPE; 39 return -1; 40 } 41 } while (msg != retmsg); 42 43 *traffic = retmsg->traffic; 44 45 ff_ipc_msg_free(msg); 46 47 return 0; 48 } 49 50 int main(int argc, char **argv) 51 { 52 int ch, delay = 1, n = 0; 53 int single = 0; 54 unsigned int i, j; 55 struct ff_traffic_args traffic = {0, 0, 0, 0}, otr; 56 struct ff_traffic_args ptraffic[RTE_MAX_LCORE], potr[RTE_MAX_LCORE]; 57 int proc_id = 0, max_proc_id = -1; 58 uint64_t rxp, rxb, txp, txb; 59 uint64_t prxp, prxb, ptxp, ptxb; 60 int title_line = 40; 61 62 ff_ipc_init(); 63 64 #define DIFF(member) (traffic.member - otr.member) 65 #define DIFF_P(member) (ptraffic[j].member - potr[j].member) 66 #define ADD_S(member) (traffic.member += ptraffic[j].member) 67 68 while ((ch = getopt(argc, argv, "hp:P:d:n:s")) != -1) { 69 switch(ch) { 70 case 'p': 71 proc_id = atoi(optarg); 72 ff_set_proc_id(proc_id); 73 break; 74 case 'P': 75 max_proc_id = atoi(optarg); 76 if (max_proc_id < 0 || max_proc_id >= RTE_MAX_LCORE) { 77 usage(); 78 ff_ipc_exit(); 79 return -1; 80 } 81 if (max_proc_id > title_line - 2) 82 title_line = max_proc_id + 2; 83 break; 84 case 'd': 85 delay = atoi(optarg) ?: 1; 86 break; 87 case 'n': 88 n = atoi(optarg); 89 break; 90 case 's': 91 single = 1; 92 break; 93 case 'h': 94 default: 95 usage(); 96 ff_ipc_exit(); 97 return -1; 98 } 99 } 100 101 if (single) { 102 if (max_proc_id == -1) { 103 if (traffic_status(&traffic)) { 104 printf("fstack ipc message error !\n"); 105 ff_ipc_exit(); 106 return -1; 107 } 108 109 printf("%lu,%lu,%lu,%lu\n", traffic.rx_packets, traffic.rx_bytes, 110 traffic.tx_packets, traffic.tx_bytes); 111 } else { 112 for (j = proc_id; j <= max_proc_id; j++) { 113 ff_set_proc_id(j); 114 if (traffic_status(&ptraffic[j])) { 115 printf("fstack ipc message error, proc id:%d!\n", j); 116 ff_ipc_exit(); 117 return -1; 118 } 119 120 printf("%9d,%20lu,%20lu,%20lu,%20lu,\n", 121 j, ptraffic[j].rx_packets, ptraffic[j].rx_bytes, 122 ptraffic[j].tx_packets, ptraffic[j].tx_bytes); 123 124 ADD_S(rx_packets); 125 ADD_S(rx_bytes); 126 ADD_S(tx_packets); 127 ADD_S(tx_bytes); 128 } 129 130 printf("%9s,%20lu,%20lu,%20lu,%20lu,\n", 131 "total", traffic.rx_packets, traffic.rx_bytes, 132 traffic.tx_packets, traffic.tx_bytes); 133 } 134 ff_ipc_exit(); 135 return 0; 136 } 137 138 for (i = 0; ; i++) { 139 if (max_proc_id == -1) { 140 if (traffic_status(&traffic)) { 141 printf("fstack ipc message error !\n"); 142 ff_ipc_exit(); 143 return -1; 144 } 145 146 if (i % title_line == 0) { 147 printf("|--------------------|--------------------|"); 148 printf("--------------------|--------------------|\n"); 149 printf("|%20s|%20s|%20s|%20s|\n", "rx packets", "rx bytes", 150 "tx packets", "tx bytes"); 151 printf("|--------------------|--------------------|"); 152 printf("--------------------|--------------------|\n"); 153 } 154 155 if (i) { 156 rxp = DIFF(rx_packets); 157 rxb = DIFF(rx_bytes); 158 txp = DIFF(tx_packets); 159 txb = DIFF(tx_bytes); 160 161 printf("|%20lu|%20lu|%20lu|%20lu|\n", rxp, rxb, txp, txb); 162 } 163 } else { 164 /* 165 * get and show traffic from proc_id to max_proc_id. 166 */ 167 if (i % (title_line / (max_proc_id - proc_id + 2)) == 0) { 168 printf("|---------|--------------------|--------------------|" 169 "--------------------|--------------------|\n"); 170 printf("|%9s|%20s|%20s|%20s|%20s|\n", 171 "proc_id", "rx packets", "rx bytes", 172 "tx packets", "tx bytes"); 173 printf("|---------|--------------------|--------------------|" 174 "--------------------|--------------------|\n"); 175 } 176 177 rxp = rxb = txp = txb = 0; 178 for (j = proc_id; j <= max_proc_id; j++) { 179 potr[j] = ptraffic[j]; 180 181 ff_set_proc_id(j); 182 if (traffic_status(&ptraffic[j])) { 183 printf("fstack ipc message error, proc id:%d!\n", j); 184 ff_ipc_exit(); 185 return -1; 186 } 187 188 if (i) { 189 prxp = DIFF_P(rx_packets); 190 prxb = DIFF_P(rx_bytes); 191 ptxp = DIFF_P(tx_packets); 192 ptxb = DIFF_P(tx_bytes); 193 printf("|%9d|%20lu|%20lu|%20lu|%20lu|\n", 194 j, prxp, prxb, ptxp, ptxb); 195 196 rxp += prxp; 197 rxb += prxb; 198 txp += ptxp; 199 txb += ptxb; 200 201 if (j == max_proc_id) { 202 printf("|%9s|%20lu|%20lu|%20lu|%20lu|\n", 203 "total", rxp, rxb, txp, txb); 204 printf("| | |" 205 " | |" 206 " |\n"); 207 } 208 } 209 } 210 } 211 212 if (n && i >= n) { 213 break; 214 } 215 216 otr = traffic; 217 sleep(delay); 218 } 219 220 ff_ipc_exit(); 221 return 0; 222 } 223