1 #include <unistd.h> 2 #include <strings.h> 3 #include "ff_ipc.h" 4 5 void 6 usage(void) 7 { 8 printf("Usage:\n"); 9 printf(" knictl [-p <f-stack proc_id>] [-P <max proc_id>] " 10 "[-a alltokni/alltoff/default][-n]\n use `-a` to set kni action\n use `-n` to show \n"); 11 } 12 13 enum FF_KNICTL_CMD get_action(const char *c){ 14 if (!c) 15 return FF_KNICTL_ACTION_MAX; 16 if (0 == strcasecmp(c, "alltokni")){ 17 return FF_KNICTL_ACTION_ALL_TO_KNI; 18 } else if (0 == strcasecmp(c, "alltoff")){ 19 return FF_KNICTL_ACTION_ALL_TO_FF; 20 } else if (0 == strcasecmp(c, "default")){ 21 return FF_KNICTL_ACTION_DEFAULT; 22 } else { 23 return FF_KNICTL_ACTION_MAX; 24 } 25 } 26 27 const char * get_action_str(enum FF_KNICTL_CMD cmd){ 28 switch (cmd) 29 { 30 case FF_KNICTL_ACTION_ALL_TO_KNI: 31 return "alltokni"; 32 break; 33 case FF_KNICTL_ACTION_ALL_TO_FF: 34 return "alltoff"; 35 break; 36 case FF_KNICTL_ACTION_DEFAULT: 37 return "default"; 38 break; 39 default: 40 return "unknown"; 41 break; 42 } 43 return "unknown"; 44 } 45 46 47 int knictl_status(struct ff_knictl_args *knictl){ 48 int ret; 49 struct ff_msg *msg, *retmsg = NULL; 50 51 msg = ff_ipc_msg_alloc(); 52 if (msg == NULL) { 53 errno = ENOMEM; 54 return -1; 55 } 56 57 msg->msg_type = FF_KNICTL; 58 msg->knictl = *knictl; 59 ret = ff_ipc_send(msg); 60 if (ret < 0) { 61 errno = EPIPE; 62 ff_ipc_msg_free(msg); 63 return -1; 64 } 65 66 do { 67 if (retmsg != NULL) { 68 ff_ipc_msg_free(retmsg); 69 } 70 71 ret = ff_ipc_recv(&retmsg, msg->msg_type); 72 if (ret < 0) { 73 errno = EPIPE; 74 ff_ipc_msg_free(msg); 75 return -1; 76 } 77 } while (msg != retmsg); 78 79 *knictl = retmsg->knictl; 80 81 ff_ipc_msg_free(msg); 82 83 return 0; 84 } 85 86 int main(int argc, char **argv) 87 { 88 int ch, has_action = 0, i; 89 enum FF_KNICTL_CMD cmd; 90 struct ff_knictl_args knictl = {.kni_cmd = FF_KNICTL_CMD_GET}; 91 struct ff_knictl_args pknictl[RTE_MAX_LCORE]; 92 int proc_id = 0, max_proc_id = -1; 93 94 ff_ipc_init(); 95 while ((ch = getopt(argc, argv, "hp:P:a:n")) != -1) { 96 switch(ch) { 97 case 'p': 98 proc_id = atoi(optarg); 99 ff_set_proc_id(proc_id); 100 break; 101 case 'P': 102 max_proc_id = atoi(optarg); 103 if (max_proc_id < 0 || max_proc_id >= RTE_MAX_LCORE) { 104 usage(); 105 ff_ipc_exit(); 106 return -1; 107 } 108 break; 109 case 'a': 110 if (has_action){ 111 usage(); 112 ff_ipc_exit(); 113 return -1; 114 } 115 has_action = 1; 116 cmd = knictl.kni_cmd = FF_KNICTL_CMD_SET; 117 knictl.kni_action = get_action(optarg); 118 if (knictl.kni_action < FF_KNICTL_ACTION_DEFAULT || knictl.kni_action >= FF_KNICTL_ACTION_MAX){ 119 usage(); 120 ff_ipc_exit(); 121 return -1; 122 } 123 break; 124 case 'n': 125 if (has_action){ 126 usage(); 127 ff_ipc_exit(); 128 return -1; 129 } 130 has_action = 1; 131 cmd = knictl.kni_cmd = FF_KNICTL_CMD_GET; 132 break; 133 case 'h': 134 default: 135 usage(); 136 ff_ipc_exit(); 137 return -1; 138 } 139 } 140 if (max_proc_id == -1){ 141 printf(" using default proc id\n"); 142 int ret = knictl_status(&knictl); 143 printf(" %s to %s knictl type: %s\n", ret ? "fail": "success", knictl.kni_cmd == FF_KNICTL_CMD_GET ? "get" : "set", get_action_str(knictl.kni_action)); 144 } 145 else { 146 int proc_id = 0; 147 for (; proc_id < max_proc_id; proc_id++){ 148 pknictl[proc_id] = knictl; 149 ff_set_proc_id(proc_id); 150 int ret = knictl_status(&pknictl[proc_id]); 151 printf(" %s to %s knictl type: %s, proc_id: %d\n", ret ? "fail": "success", pknictl[proc_id].kni_cmd == FF_KNICTL_CMD_GET ? "get" : "set", get_action_str(pknictl[proc_id].kni_action), proc_id); 152 } 153 } 154 155 ff_ipc_exit(); 156 }