| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <sys/ioctl.h> |
| #include <fcntl.h> |
| #include <getopt.h> |
| #include <string.h> |
| #ifndef CONFIG_SUPPORT_OPENWRT |
| #include "linux/autoconf.h" |
| #endif |
| #include "mtr_ioctl.h" |
| #include "mtr_api.h" |
| |
| |
| void show_usage(void) |
| { |
| |
| printf("Add Mac Upload Meter Rule\n"); |
| printf("mtr -a -m [Mac] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n"); |
| printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n"); |
| printf("ByteBase:mtr -a -m 00:11:22:33:44:55 -t 10 -s 8K -v Byte\n\n"); |
| printf("PktBase:mtr -a -m 00:11:22:33:44:55 -s 100 -u 1ms -v Pkt\n\n"); |
| |
| printf("Add Mac Download Meter Rule\n"); |
| printf("mtr -b -m [Mac] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n"); |
| printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n"); |
| printf("ByteBase: mtr -b -m 00:11:22:33:44:55 -t 10 -s 8K -v Byte\n\n"); |
| printf("PktBase: mtr -b -m 00:11:22:33:44:55 -s 100 -u 1ms -v Pkt\n\n"); |
| printf("Del Mac Upload Meter Rule\n"); |
| printf("mtr -c -m [Mac]\n"); |
| printf("Ex: mtr -c -m 00:11:22:33:44:55\n\n"); |
| |
| printf("Del Mac download Meter Rule\n"); |
| printf("mtr -d -m [Mac]\n"); |
| printf("Ex: mtr -d -m 00:11:22:33:44:55\n\n"); |
| |
| |
| printf("Add IP Upload Meter Rule\n"); |
| printf("mtr -e -i [IpS] -j [IpE] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n"); |
| printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n"); |
| printf("ByteBase: mtr -e -i 10.10.10.3 -j 10.10.10.3 -t 10 -s 8K -v Byte\n\n"); |
| printf("PktBase: mtr -e -i 10.10.10.3 -j 10.10.10.3 -s 100 -u 1ms -v Pkt\n\n"); |
| |
| printf("Add IP Download Meter Rule\n"); |
| printf("mtr -f -i [IpS] -j [IpE] -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127] \n"); |
| printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n"); |
| printf("ByteBase: mtr -f -i 10.10.10.3 -t 10 -s 8K -v Byte\n\n"); |
| printf("PktBase: mtr -f -i 10.10.10.3 -j 10.10.10.3 -s 100 -u 50ms -v Pkt\n\n"); |
| |
| printf("Del IP Upload Meter Rule\n"); |
| printf("mtr -g -i [IpS] -j [IpE]\n"); |
| printf("mtr -g -i 10.10.10.3 -j 10.10.10.3\n\n"); |
| |
| printf("Del IP Download Meter Rule\n"); |
| printf("mtr -h -i [IpS] -j [IpE]\n"); |
| printf("mtr -h -i 10.10.10.3 -j 10.10.10.3\n\n"); |
| |
| printf("Clear Meter Table\n"); |
| printf("mtr -z\n\n"); |
| |
| printf("Add SYN Meter Rule: mtr -k\n"); |
| printf("Add FIN Meter Rule: mtr -l\n"); |
| printf("Add UDP Meter Rule: mtr -n\n"); |
| printf("Add ICMP Meter Rule: -o\n"); |
| printf(" -t [KB/s] -s [BucketSize:4K/8K/16K/32K or 0~127]\n"); |
| printf(" -u [MtrIntval:1ms/10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms] -v [Base:Byte/Pkt]\n\n"); |
| printf("Del SYN Meter Rule:mtr -p\n"); |
| printf("Del FIN Meter Rule:mtr -q\n"); |
| printf("Del UDP Meter Rule:mtr -r\n"); |
| printf("Del ICMP Meter Rule:mtr -y\n\n"); |
| |
| printf("Get All Mtr Entries: mtr -w\n"); |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| int opt; |
| char options[] = "abcdefghklnopqryz?m:i:j:t:s:u:v:w"; |
| |
| int fd; |
| int method=-1; |
| struct mtr_args args; |
| struct mtr_list_args *args2; |
| int result; |
| int i; |
| |
| args2=malloc(sizeof(struct mtr_list_args) + sizeof(struct mtr_args)*511); |
| if (NULL == args2) |
| { |
| printf(" allocate memory for mtr_list_args and mtr_args failed.\n"); |
| return 0; |
| } |
| fd = open("/dev/"MTR_DEVNAME, O_RDONLY); |
| if (fd < 0) |
| { |
| printf("Open %s pseudo device failed\n","/dev/"MTR_DEVNAME); |
| free(args2); |
| return 0; |
| } |
| |
| if(argc < 2) { |
| show_usage(); |
| free(args2); |
| close(fd); |
| return 0; |
| } |
| |
| |
| while ((opt = getopt (argc, argv, options)) != -1) { |
| switch (opt) { |
| case 'a': |
| method=MTR_ADD_MAC_UL_ENTRY; |
| break; |
| case 'b': |
| method=MTR_ADD_MAC_DL_ENTRY; |
| break; |
| case 'c': |
| method=MTR_DEL_MAC_UL_ENTRY; |
| break; |
| case 'd': |
| method=MTR_DEL_MAC_DL_ENTRY; |
| break; |
| case 'e': |
| method=MTR_ADD_IP_UL_ENTRY; |
| break; |
| case 'f': |
| method=MTR_ADD_IP_DL_ENTRY; |
| break; |
| case 'g': |
| method=MTR_DEL_IP_UL_ENTRY; |
| break; |
| case 'h': |
| method=MTR_DEL_IP_DL_ENTRY; |
| break; |
| case 'k': |
| method=MTR_ADD_SYN_ENTRY; |
| break; |
| case 'l': |
| method=MTR_ADD_FIN_ENTRY; |
| break; |
| case 'n': |
| method=MTR_ADD_UDP_ENTRY; |
| break; |
| case 'o': |
| method=MTR_ADD_ICMP_ENTRY; |
| break; |
| case 'p': |
| method=MTR_DEL_SYN_ENTRY; |
| break; |
| case 'q': |
| method=MTR_DEL_FIN_ENTRY; |
| break; |
| case 'r': |
| method=MTR_DEL_UDP_ENTRY; |
| break; |
| case 'y': |
| method=MTR_DEL_ICMP_ENTRY; |
| break; |
| case 'z': /* CleanTbl */ |
| method=MTR_CLEAN_TBL; |
| break; |
| case 'm': /* Mac */ |
| str_to_mac(args.mac, optarg); |
| break; |
| case 'i': /* IpS */ |
| str_to_ip(&args.ip_s, optarg); |
| break; |
| case 'j': /* IpE */ |
| str_to_ip(&args.ip_e, optarg); |
| break; |
| case 't': /* TokenRate */ |
| args.token_rate=strtoll(optarg, NULL, 10); |
| break; |
| case 's': /* Bucket Size */ |
| if(strcasecmp(optarg,"4K")==0){ |
| args.bk_size=0; |
| }else if(strcasecmp(optarg,"8K")==0){ |
| args.bk_size=1; |
| }else if(strcasecmp(optarg,"16K")==0){ |
| args.bk_size=2; |
| }else if(strcasecmp(optarg,"32K")==0){ |
| args.bk_size=3; |
| }else { |
| args.bk_size=strtoll(optarg, NULL, 10); |
| } |
| break; |
| case 'u': |
| if(strcasecmp(optarg,"1ms")==0){ |
| args.mtr_intval=_1MS; |
| }else if(strcasecmp(optarg,"10ms")==0){ |
| args.mtr_intval=_10MS; |
| }else if(strcasecmp(optarg,"50ms")==0){ |
| args.mtr_intval=_50MS; |
| }else if(strcasecmp(optarg,"100ms")==0){ |
| args.mtr_intval=_100MS; |
| }else if(strcasecmp(optarg,"500ms")==0){ |
| args.mtr_intval=_500MS; |
| }else if(strcasecmp(optarg,"1000ms")==0){ |
| args.mtr_intval=_1000MS; |
| }else if(strcasecmp(optarg,"5000ms")==0){ |
| args.mtr_intval=_5000MS; |
| }else if(strcasecmp(optarg,"10000ms")==0){ |
| args.mtr_intval=_10000MS; |
| }else { |
| printf("Error: -u 10ms/50ms/100ms/500ms/1000ms/5000ms/10000ms\n"); |
| free(args2); |
| close(fd); |
| return 0; |
| } |
| break; |
| case 'v': |
| if(strcasecmp(optarg,"Byte")==0){ |
| args.mtr_mode=0; |
| }else if(strcasecmp(optarg,"Pkt")==0){ |
| args.mtr_mode=1; |
| }else { |
| printf("Error: -v Byte/Pkt\n"); |
| free(args2); |
| close(fd); |
| return 0; |
| } |
| break; |
| case 'w': |
| method=MTR_GET_ALL_ENTRIES; |
| break; |
| case '?': /* Help */ |
| show_usage(); |
| break; |
| } |
| } |
| |
| switch(method) |
| { |
| case MTR_ADD_MAC_UL_ENTRY: |
| case MTR_ADD_MAC_DL_ENTRY: |
| case MTR_DEL_MAC_UL_ENTRY: |
| case MTR_DEL_MAC_DL_ENTRY: |
| case MTR_ADD_IP_UL_ENTRY: |
| case MTR_ADD_IP_DL_ENTRY: |
| case MTR_DEL_IP_UL_ENTRY: |
| case MTR_DEL_IP_DL_ENTRY: |
| case MTR_CLEAN_TBL: |
| case MTR_ADD_SYN_ENTRY: |
| case MTR_ADD_FIN_ENTRY: |
| case MTR_ADD_UDP_ENTRY: |
| case MTR_ADD_ICMP_ENTRY: |
| case MTR_DEL_SYN_ENTRY: |
| case MTR_DEL_FIN_ENTRY: |
| case MTR_DEL_UDP_ENTRY: |
| case MTR_DEL_ICMP_ENTRY: |
| SetMtrEntry(&args, method); |
| result = args.result; |
| break; |
| case MTR_GET_ALL_ENTRIES: |
| MtrGetAllEntries(args2); |
| result = args2->result; |
| |
| printf("Total Entry Count = %d\n",args2->num_of_entries); |
| for(i=0;i<args2->num_of_entries;i++){ |
| printf("#%d :MAC=%02X:%02X:%02X:%02X:%02X:%02X\n", \ |
| i, args2->entries[i].mac[0], args2->entries[i].mac[1], args2->entries[i].mac[2], \ |
| args2->entries[i].mac[3], args2->entries[i].mac[4], args2->entries[i].mac[5]); |
| printf(" :SIP %u.%u.%u.%u->%u.%u.%u.%u\n\r", NIPQUAD(args2->entries[i].ip_s), NIPQUAD(args2->entries[i].ip_e)); |
| printf(" :BucketSize=%d Token_Rate:%d MtrInterval=%d\n", args2->entries[i].bk_size, args2->entries[i].token_rate, args2->entries[i].mtr_intval); |
| } |
| break; |
| default: |
| result = MTR_FAIL; |
| } |
| |
| |
| if(result == MTR_TBL_FULL) { |
| printf("table full\n"); |
| }else if(result == MTR_FAIL){ |
| printf("fail\n"); |
| }else{ |
| printf("done\n"); |
| } |
| |
| free(args2); |
| close(fd); |
| return 0; |
| } |