blob: 089320e9ad492437cf8ac72b8aa3af18c0e4cdee [file] [log] [blame]
xjb04a4022021-11-25 15:01:52 +08001#include <stdlib.h>
2#include <stdio.h>
3#include <string.h>
4#include <sys/ioctl.h>
5#include <fcntl.h>
6#include <getopt.h>
7#include <string.h>
8#ifndef CONFIG_SUPPORT_OPENWRT
9#include "linux/autoconf.h"
10#endif
11#include "mtr_ioctl.h"
12#include "mtr_api.h"
13
14
15void show_usage(void)
16{
17
18 printf("Add Mac Upload Meter Rule\n");
19 printf("mtr -a -m [Mac] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n");
20 printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n");
21 printf("ByteBase:mtr -a -m 00:11:22:33:44:55 -t 10 -s 8K -v Byte\n\n");
22 printf("PktBase:mtr -a -m 00:11:22:33:44:55 -s 100 -u 1ms -v Pkt\n\n");
23
24 printf("Add Mac Download Meter Rule\n");
25 printf("mtr -b -m [Mac] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n");
26 printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n");
27 printf("ByteBase: mtr -b -m 00:11:22:33:44:55 -t 10 -s 8K -v Byte\n\n");
28 printf("PktBase: mtr -b -m 00:11:22:33:44:55 -s 100 -u 1ms -v Pkt\n\n");
29 printf("Del Mac Upload Meter Rule\n");
30 printf("mtr -c -m [Mac]\n");
31 printf("Ex: mtr -c -m 00:11:22:33:44:55\n\n");
32
33 printf("Del Mac download Meter Rule\n");
34 printf("mtr -d -m [Mac]\n");
35 printf("Ex: mtr -d -m 00:11:22:33:44:55\n\n");
36
37
38 printf("Add IP Upload Meter Rule\n");
39 printf("mtr -e -i [IpS] -j [IpE] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n");
40 printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n");
41 printf("ByteBase: mtr -e -i 10.10.10.3 -j 10.10.10.3 -t 10 -s 8K -v Byte\n\n");
42 printf("PktBase: mtr -e -i 10.10.10.3 -j 10.10.10.3 -s 100 -u 1ms -v Pkt\n\n");
43
44 printf("Add IP Download Meter Rule\n");
45 printf("mtr -f -i [IpS] -j [IpE] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127] \n");
46 printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n");
47 printf("ByteBase: mtr -f -i 10.10.10.3 -t 10 -s 8K -v Byte\n\n");
48 printf("PktBase: mtr -f -i 10.10.10.3 -j 10.10.10.3 -s 100 -u 50ms -v Pkt\n\n");
49
50 printf("Del IP Upload Meter Rule\n");
51 printf("mtr -g -i [IpS] -j [IpE]\n");
52 printf("mtr -g -i 10.10.10.3 -j 10.10.10.3\n\n");
53
54 printf("Del IP Download Meter Rule\n");
55 printf("mtr -h -i [IpS] -j [IpE]\n");
56 printf("mtr -h -i 10.10.10.3 -j 10.10.10.3\n\n");
57
58 printf("Clear Meter Table\n");
59 printf("mtr -z\n\n");
60
61 printf("Add SYN Meter Rule: mtr -k\n");
62 printf("Add FIN Meter Rule: mtr -l\n");
63 printf("Add UDP Meter Rule: mtr -n\n");
64 printf("Add ICMP Meter Rule: -o\n");
65 printf(" -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n");
66 printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n\n");
67 printf("Del SYN Meter Rule:mtr -p\n");
68 printf("Del FIN Meter Rule:mtr -q\n");
69 printf("Del UDP Meter Rule:mtr -r\n");
70 printf("Del ICMP Meter Rule:mtr -y\n\n");
71
72 printf("Get All Mtr Entries: mtr -w\n");
73}
74
75int main(int argc, char *argv[])
76{
77 int opt;
78 char options[] = "abcdefghklnopqryz?m:i:j:t:s:u:v:w";
79
80 int fd;
81 int method=-1;
82 struct mtr_args args;
83 struct mtr_list_args *args2;
84 int result;
85 int i;
86
87 args2=malloc(sizeof(struct mtr_list_args) + sizeof(struct mtr_args)*511);
88 if (NULL == args2)
89 {
90 printf(" allocate memory for mtr_list_args and mtr_args failed.\n");
91 return 0;
92 }
93 fd = open("/dev/"MTR_DEVNAME, O_RDONLY);
94 if (fd < 0)
95 {
96 printf("Open %s pseudo device failed\n","/dev/"MTR_DEVNAME);
97 free(args2);
98 return 0;
99 }
100
101 if(argc < 2) {
102 show_usage();
103 free(args2);
104 close(fd);
105 return 0;
106 }
107
108
109 while ((opt = getopt (argc, argv, options)) != -1) {
110 switch (opt) {
111 case 'a':
112 method=MTR_ADD_MAC_UL_ENTRY;
113 break;
114 case 'b':
115 method=MTR_ADD_MAC_DL_ENTRY;
116 break;
117 case 'c':
118 method=MTR_DEL_MAC_UL_ENTRY;
119 break;
120 case 'd':
121 method=MTR_DEL_MAC_DL_ENTRY;
122 break;
123 case 'e':
124 method=MTR_ADD_IP_UL_ENTRY;
125 break;
126 case 'f':
127 method=MTR_ADD_IP_DL_ENTRY;
128 break;
129 case 'g':
130 method=MTR_DEL_IP_UL_ENTRY;
131 break;
132 case 'h':
133 method=MTR_DEL_IP_DL_ENTRY;
134 break;
135 case 'k':
136 method=MTR_ADD_SYN_ENTRY;
137 break;
138 case 'l':
139 method=MTR_ADD_FIN_ENTRY;
140 break;
141 case 'n':
142 method=MTR_ADD_UDP_ENTRY;
143 break;
144 case 'o':
145 method=MTR_ADD_ICMP_ENTRY;
146 break;
147 case 'p':
148 method=MTR_DEL_SYN_ENTRY;
149 break;
150 case 'q':
151 method=MTR_DEL_FIN_ENTRY;
152 break;
153 case 'r':
154 method=MTR_DEL_UDP_ENTRY;
155 break;
156 case 'y':
157 method=MTR_DEL_ICMP_ENTRY;
158 break;
159 case 'z': /* CleanTbl */
160 method=MTR_CLEAN_TBL;
161 break;
162 case 'm': /* Mac */
163 str_to_mac(args.mac, optarg);
164 break;
165 case 'i': /* IpS */
166 str_to_ip(&args.ip_s, optarg);
167 break;
168 case 'j': /* IpE */
169 str_to_ip(&args.ip_e, optarg);
170 break;
171 case 't': /* TokenRate */
172 args.token_rate=strtoll(optarg, NULL, 10);
173 break;
174 case 's': /* Bucket Size */
175 if(strcasecmp(optarg,"4K")==0){
176 args.bk_size=0;
177 }else if(strcasecmp(optarg,"8K")==0){
178 args.bk_size=1;
179 }else if(strcasecmp(optarg,"16K")==0){
180 args.bk_size=2;
181 }else if(strcasecmp(optarg,"32K")==0){
182 args.bk_size=3;
183 }else {
184 args.bk_size=strtoll(optarg, NULL, 10);
185 }
186 break;
187 case 'u':
188 if(strcasecmp(optarg,"1ms")==0){
189 args.mtr_intval=_1MS;
190 }else if(strcasecmp(optarg,"10ms")==0){
191 args.mtr_intval=_10MS;
192 }else if(strcasecmp(optarg,"50ms")==0){
193 args.mtr_intval=_50MS;
194 }else if(strcasecmp(optarg,"100ms")==0){
195 args.mtr_intval=_100MS;
196 }else if(strcasecmp(optarg,"500ms")==0){
197 args.mtr_intval=_500MS;
198 }else if(strcasecmp(optarg,"1000ms")==0){
199 args.mtr_intval=_1000MS;
200 }else if(strcasecmp(optarg,"5000ms")==0){
201 args.mtr_intval=_5000MS;
202 }else if(strcasecmp(optarg,"10000ms")==0){
203 args.mtr_intval=_10000MS;
204 }else {
205 printf("Error: -u 10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms\n");
206 free(args2);
207 close(fd);
208 return 0;
209 }
210 break;
211 case 'v':
212 if(strcasecmp(optarg,"Byte")==0){
213 args.mtr_mode=0;
214 }else if(strcasecmp(optarg,"Pkt")==0){
215 args.mtr_mode=1;
216 }else {
217 printf("Error: -v Byte/Pkt\n");
218 free(args2);
219 close(fd);
220 return 0;
221 }
222 break;
223 case 'w':
224 method=MTR_GET_ALL_ENTRIES;
225 break;
226 case '?': /* Help */
227 show_usage();
228 break;
229 }
230 }
231
232 switch(method)
233 {
234 case MTR_ADD_MAC_UL_ENTRY:
235 case MTR_ADD_MAC_DL_ENTRY:
236 case MTR_DEL_MAC_UL_ENTRY:
237 case MTR_DEL_MAC_DL_ENTRY:
238 case MTR_ADD_IP_UL_ENTRY:
239 case MTR_ADD_IP_DL_ENTRY:
240 case MTR_DEL_IP_UL_ENTRY:
241 case MTR_DEL_IP_DL_ENTRY:
242 case MTR_CLEAN_TBL:
243 case MTR_ADD_SYN_ENTRY:
244 case MTR_ADD_FIN_ENTRY:
245 case MTR_ADD_UDP_ENTRY:
246 case MTR_ADD_ICMP_ENTRY:
247 case MTR_DEL_SYN_ENTRY:
248 case MTR_DEL_FIN_ENTRY:
249 case MTR_DEL_UDP_ENTRY:
250 case MTR_DEL_ICMP_ENTRY:
251 SetMtrEntry(&args, method);
252 result = args.result;
253 break;
254 case MTR_GET_ALL_ENTRIES:
255 MtrGetAllEntries(args2);
256 result = args2->result;
257
258 printf("Total Entry Count = %d\n",args2->num_of_entries);
259 for(i=0;i<args2->num_of_entries;i++){
260 printf("#%d :MAC=%02X:%02X:%02X:%02X:%02X:%02X\n", \
261 i, args2->entries[i].mac[0], args2->entries[i].mac[1], args2->entries[i].mac[2], \
262 args2->entries[i].mac[3], args2->entries[i].mac[4], args2->entries[i].mac[5]);
263 printf(" :SIP %u.%u.%u.%u->%u.%u.%u.%u\n\r", NIPQUAD(args2->entries[i].ip_s), NIPQUAD(args2->entries[i].ip_e));
264 printf(" :BucketSize=%d Token_Rate:%d MtrInterval=%d\n", args2->entries[i].bk_size, args2->entries[i].token_rate, args2->entries[i].mtr_intval);
265 }
266 break;
267 default:
268 result = MTR_FAIL;
269 }
270
271
272 if(result == MTR_TBL_FULL) {
273 printf("table full\n");
274 }else if(result == MTR_FAIL){
275 printf("fail\n");
276 }else{
277 printf("done\n");
278 }
279
280 free(args2);
281 close(fd);
282 return 0;
283}