diff options
Diffstat (limited to 'package/ramips/applications/hwnat/src/mtr.c')
-rwxr-xr-x | package/ramips/applications/hwnat/src/mtr.c | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/package/ramips/applications/hwnat/src/mtr.c b/package/ramips/applications/hwnat/src/mtr.c new file mode 100755 index 0000000..e9c0c89 --- /dev/null +++ b/package/ramips/applications/hwnat/src/mtr.c @@ -0,0 +1,322 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <getopt.h> +#include <string.h> + +#include "linux/autoconf.h" +#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; +} |