#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;
}
