Exemple #1
0
int main(int argc, char *argv[])
{
    int opt;
#if !defined (CONFIG_HNAT_V2)
    char options[] = "efg?c:d:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:T:U:V:Z:";
#else
    char options[] = "aefg?c:d:A:B:C:DN:O:P:Q:T:U:V:Z:";
#endif
    int fd, method;
    int i=0;
    unsigned int entry_num;
    unsigned int debug;
    unsigned int dir;
    struct hwnat_args *args;
    struct hwnat_tuple args2;
#if !defined (CONFIG_HNAT_V2)
    struct hwnat_qos_args args3;
#else
    struct hwnat_ac_args args3;
#endif
    struct hwnat_config_args args4;

#if defined (CONFIG_PPE_MCAST)
    struct hwnat_mcast_args args5;
    unsigned char mac[6];
#endif

    int	   result;

    fd = open("/dev/"HW_NAT_DEVNAME, O_RDONLY);
    if (fd < 0)
    {
	printf("Open %s pseudo device failed\n","/dev/"HW_NAT_DEVNAME);
	return 0;
    }

    if(argc < 2) {
	show_usage();
	return 0;
    }

    /* Max table size is 16K */
    args=malloc(sizeof(struct hwnat_args)+sizeof(struct hwnat_tuple)*1024*16);

    while ((opt = getopt (argc, argv, options)) != -1) {
	switch (opt) {
#if defined (CONFIG_HNAT_V2)
	case 'a':
		method = HW_NAT_DUMP_CACHE_ENTRY;
		break;
#endif
	case 'c':
		method = HW_NAT_DUMP_ENTRY;
		entry_num = strtoll(optarg, NULL, 10);
		break;
	case 'd':
		method = HW_NAT_DEBUG;
		debug = strtoll(optarg, NULL, 10);
		break;
	case 'e':
		method = HW_NAT_GET_ALL_ENTRIES;
		args->entry_state=0; /* invalid entry */
		break;
	case 'f':
		method = HW_NAT_GET_ALL_ENTRIES;
		args->entry_state=1; /* unbinded entry */
		break;
	case 'g':
		method = HW_NAT_GET_ALL_ENTRIES;
		args->entry_state=2; /* binded entry */
		break;
#if !defined (CONFIG_HNAT_V2)
	case 'A':
		method = HW_NAT_DSCP_REMARK;
		args3.enable = strtoll(optarg, NULL, 10);
		break;
	case 'B':
		method = HW_NAT_VPRI_REMARK;
		args3.enable = strtoll(optarg, NULL, 10);
		break;
	case 'C':
		method = HW_NAT_FOE_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'D':
		method = HW_NAT_ACL_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'E':
		method = HW_NAT_DSCP_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'F':
		method = HW_NAT_VPRI_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'G':
		method = HW_NAT_DSCP_UP;
		args3.dscp_set = strtoll(argv[2], NULL, 10);
		args3.up = strtoll(argv[3], NULL, 10);
		break;
	case 'H':
		method = HW_NAT_UP_IDSCP;

		args3.up = strtoll(argv[2], NULL, 10);
		args3.dscp = strtoll(argv[3], NULL, 10);
		break;
	case 'I':
		method = HW_NAT_UP_ODSCP;
		args3.up = strtoll(argv[2], NULL, 10);
		args3.dscp = strtoll(argv[3], NULL, 10);
		break;
	case 'J':
		method = HW_NAT_UP_VPRI;
		args3.up = strtoll(argv[2], NULL, 10);
		args3.vpri = strtoll(argv[3], NULL, 10);
		break;
	case 'K':
		method = HW_NAT_UP_AC;
		args3.up = strtoll(argv[2], NULL, 10);
		args3.ac = strtoll(argv[3], NULL, 10);
		break;
	case 'L':
		method = HW_NAT_SCH_MODE;
		args3.mode = strtoll(argv[2], NULL, 10);
		break;
	case 'M':
		method = HW_NAT_SCH_WEIGHT;
		args3.weight3 = strtoll(argv[2], NULL, 10);
		args3.weight2 = strtoll(argv[3], NULL, 10);
		args3.weight1 = strtoll(argv[4], NULL, 10);
		args3.weight0 = strtoll(argv[5], NULL, 10);
		break;
#else
	case 'A':
		method = HW_NAT_GET_AC_CNT;
		args3.ag_index = strtoll(optarg, NULL, 10);
		break;
#if defined (CONFIG_PPE_MCAST)
	case 'B':
		method = HW_NAT_MCAST_INS;
		args5.mc_vid = strtoll(argv[2], NULL, 10);
		str_to_mac(mac, argv[3]);
		memcpy(args5.dst_mac, mac, sizeof(mac));
		args5.mc_px_en = strtoll(argv[4], NULL, 10);
		args5.mc_px_qos_en = strtoll(argv[5], NULL, 10);
		args5.mc_qos_qid = strtoll(argv[6], NULL, 10);
		break;
	case 'C':
		method = HW_NAT_MCAST_DEL;
		args5.mc_vid = strtoll(argv[2], NULL, 10);
		str_to_mac(mac, argv[3]);
		memcpy(args5.dst_mac, mac, sizeof(mac));
		memcpy(args5.dst_mac, mac, sizeof(mac));
		args5.mc_px_en = strtoll(argv[4], NULL, 10);
		args5.mc_px_qos_en = strtoll(argv[5], NULL, 10);
		args5.mc_qos_qid = strtoll(argv[6], NULL, 10);
		break;
	case 'D':
		method = HW_NAT_MCAST_DUMP;
		break;
#endif

#endif
	case 'N':
		method = HW_NAT_BIND_THRESHOLD;
		args4.bind_threshold = strtoll(argv[2], NULL, 10);
		break;
	case 'O':
		method = HW_NAT_MAX_ENTRY_LMT;
		args4.foe_qut_lmt = strtoll(argv[2], NULL, 10);
		args4.foe_half_lmt = strtoll(argv[3], NULL, 10);
		args4.foe_full_lmt  = strtoll(argv[4], NULL, 10);
		break;
	case 'P':
		method = HW_NAT_RULE_SIZE;
		args4.pre_acl    = strtoll(argv[2], NULL, 10);
		args4.pre_meter  = strtoll(argv[3], NULL, 10);
		args4.pre_ac     = strtoll(argv[4], NULL, 10);
		args4.post_meter = strtoll(argv[5], NULL, 10);
		args4.post_ac    = strtoll(argv[6], NULL, 10);
		break;
	case 'Q':
		method = HW_NAT_KA_INTERVAL;
		args4.foe_tcp_ka = strtoll(argv[2], NULL, 10);
		args4.foe_udp_ka = strtoll(argv[3], NULL, 10);
		break;
	case 'T':
		method = HW_NAT_UB_LIFETIME;
		args4.foe_unb_dlta = strtoll(argv[2], NULL, 10);
		break;
	case 'U':
		method = HW_NAT_BIND_LIFETIME;
		args4.foe_tcp_dlta = strtoll(argv[2], NULL, 10);
		args4.foe_udp_dlta = strtoll(argv[3], NULL, 10);
		args4.foe_fin_dlta = strtoll(argv[4], NULL, 10);
		break;
	case 'V':
		method = HW_NAT_VLAN_ID;
		args4.lan_vid = strtoll(argv[2], NULL, 10);
		args4.wan_vid = strtoll(argv[3], NULL, 10);
		break;
	case 'Z':
		method = HW_NAT_BIND_DIRECTION;
		args4.bind_dir = strtoll(optarg, NULL, 10);
		break;
	case '?':
		show_usage();

	}
    } 


    switch(method){
    case HW_NAT_GET_ALL_ENTRIES:
	    HwNatGetAllEntries(args);

	    printf("Total Entry Count = %d\n",args->num_of_entries);	
	    for(i=0;i<args->num_of_entries;i++){
		if(args->entries[i].pkt_type==0) { //IPV4_NAPT
		    printf("IPv4_NAPT=%d : %u.%u.%u.%u:%d->%u.%u.%u.%u:%d => %u.%u.%u.%u:%d->%u.%u.%u.%u:%d\n", \
			    args->entries[i].hash_index, \
			    NIPQUAD(args->entries[i].ing_sipv4), \
			    args->entries[i].ing_sp, \
			    NIPQUAD(args->entries[i].ing_dipv4), \
			    args->entries[i].ing_dp, \
			    NIPQUAD(args->entries[i].eg_sipv4), \
		            args->entries[i].eg_sp, \
		            NIPQUAD(args->entries[i].eg_dipv4), \
		            args->entries[i].eg_dp);
		} else if(args->entries[i].pkt_type==1) { //IPV4_NAT
		    printf("IPv4_NAT=%d : %u.%u.%u.%u->%u.%u.%u.%u => %u.%u.%u.%u->%u.%u.%u.%u\n", \
			    args->entries[i].hash_index, \
			    NIPQUAD(args->entries[i].ing_sipv4), \
			    NIPQUAD(args->entries[i].ing_dipv4), \
			    NIPQUAD(args->entries[i].eg_sipv4), \
			    NIPQUAD(args->entries[i].eg_dipv4)); 
		} else if(args->entries[i].pkt_type==2) { //IPV6_ROUTING
		    printf("IPv6_1T= %d /DIP: %x:%x:%x:%x:%x:%x:%x:%x\n", \
		    args->entries[i].hash_index, \
		    NIPHALF(args->entries[i].ing_dipv6_0), \
		    NIPHALF(args->entries[i].ing_dipv6_1), \
		    NIPHALF(args->entries[i].ing_dipv6_2), \
		    NIPHALF(args->entries[i].ing_dipv6_3));
		} else if(args->entries[i].pkt_type==3) { //IPV4_DSLITE
		    printf("DS-Lite= %d : %u.%u.%u.%u:%d->%u.%u.%u.%u:%d (%x:%x:%x:%x:%x:%x:%x:%x -> %x:%x:%x:%x:%x:%x:%x:%x) \n", \
			    args->entries[i].hash_index, \
			    NIPQUAD(args->entries[i].ing_sipv4),  \
			    args->entries[i].ing_sp,     \
			    NIPQUAD(args->entries[i].ing_dipv4),  \
			    args->entries[i].ing_dp, \
			    NIPHALF(args->entries[i].eg_sipv6_0), \
			    NIPHALF(args->entries[i].eg_sipv6_1), \
			    NIPHALF(args->entries[i].eg_sipv6_2), \
			    NIPHALF(args->entries[i].eg_sipv6_3), \
			    NIPHALF(args->entries[i].eg_dipv6_0), \
			    NIPHALF(args->entries[i].eg_dipv6_1), \
			    NIPHALF(args->entries[i].eg_dipv6_2), \
			    NIPHALF(args->entries[i].eg_dipv6_3));
		} else if(args->entries[i].pkt_type==4) { //IPV6_3T_ROUTE
		    printf("IPv6_3T= %d SIP: %x:%x:%x:%x:%x:%x:%x:%x DIP: %x:%x:%x:%x:%x:%x:%x:%x\n", \
		    args->entries[i].hash_index, \
		    NIPHALF(args->entries[i].ing_sipv6_0), \
		    NIPHALF(args->entries[i].ing_sipv6_1), \
		    NIPHALF(args->entries[i].ing_sipv6_2), \
		    NIPHALF(args->entries[i].ing_sipv6_3), \
		    NIPHALF(args->entries[i].ing_dipv6_0), \
		    NIPHALF(args->entries[i].ing_dipv6_1), \
		    NIPHALF(args->entries[i].ing_dipv6_2), \
		    NIPHALF(args->entries[i].ing_dipv6_3));
		} else if(args->entries[i].pkt_type==5) { //IPV6_5T_ROUTE
		    if(args->entries[i].ipv6_flowlabel==1) {
			printf("IPv6_5T= %d SIP: %x:%x:%x:%x:%x:%x:%x:%x DIP: %x:%x:%x:%x:%x:%x:%x:%x (Flow Label=%x)\n", \
				args->entries[i].hash_index, \
				NIPHALF(args->entries[i].ing_sipv6_0), \
				NIPHALF(args->entries[i].ing_sipv6_1), \
				NIPHALF(args->entries[i].ing_sipv6_2), \
				NIPHALF(args->entries[i].ing_sipv6_3), \
				NIPHALF(args->entries[i].ing_dipv6_0), \
				NIPHALF(args->entries[i].ing_dipv6_1), \
				NIPHALF(args->entries[i].ing_dipv6_2), \
				NIPHALF(args->entries[i].ing_dipv6_3), \
				((args->entries[i].ing_sp << 16) | (args->entries[i].ing_dp))&0xFFFFF);
		    }else {
			printf("IPv6_5T= %d SIP: %x:%x:%x:%x:%x:%x:%x:%x (SP:%d) DIP: %x:%x:%x:%x:%x:%x:%x:%x (DP=%d)\n", \
				args->entries[i].hash_index, \
				NIPHALF(args->entries[i].ing_sipv6_0), \
				NIPHALF(args->entries[i].ing_sipv6_1), \
				NIPHALF(args->entries[i].ing_sipv6_2), \
				NIPHALF(args->entries[i].ing_sipv6_3), \
				args->entries[i].ing_sp, \
				NIPHALF(args->entries[i].ing_dipv6_0), \
				NIPHALF(args->entries[i].ing_dipv6_1), \
				NIPHALF(args->entries[i].ing_dipv6_2), \
				NIPHALF(args->entries[i].ing_dipv6_3), \
				args->entries[i].ing_dp);
		    }

		} else if(args->entries[i].pkt_type==7) { //IPV6_6RD
		    if(args->entries[i].ipv6_flowlabel==1) {
			printf("6RD= %d %x:%x:%x:%x:%x:%x:%x:%x->%x:%x:%x:%x:%x:%x:%x:%x [Flow Label=%x]\n", \
				args->entries[i].hash_index, \
				NIPHALF(args->entries[i].ing_sipv6_0), \
				NIPHALF(args->entries[i].ing_sipv6_1), \
				NIPHALF(args->entries[i].ing_sipv6_2), \
				NIPHALF(args->entries[i].ing_sipv6_3), \
				NIPHALF(args->entries[i].ing_dipv6_0), \
				NIPHALF(args->entries[i].ing_dipv6_1), \
				NIPHALF(args->entries[i].ing_dipv6_2), \
				NIPHALF(args->entries[i].ing_dipv6_3), \
				((args->entries[i].ing_sp << 16) | (args->entries[i].ing_dp))&0xFFFFF);
				printf("(%u.%u.%u.%u->%u.%u.%u.%u)\n", NIPQUAD(args->entries[i].eg_sipv4), NIPQUAD(args->entries[i].eg_dipv4));
		    }else {
			printf("6RD= %d /SIP: %x:%x:%x:%x:%x:%x:%x:%x [SP:%d] /DIP: %x:%x:%x:%x:%x:%x:%x:%x [DP=%d]", \
				args->entries[i].hash_index, \
				NIPHALF(args->entries[i].ing_sipv6_0), \
				NIPHALF(args->entries[i].ing_sipv6_1), \
				NIPHALF(args->entries[i].ing_sipv6_2), \
				NIPHALF(args->entries[i].ing_sipv6_3), \
				args->entries[i].ing_sp, \
				NIPHALF(args->entries[i].ing_dipv6_0), \
				NIPHALF(args->entries[i].ing_dipv6_1), \
				NIPHALF(args->entries[i].ing_dipv6_2), \
				NIPHALF(args->entries[i].ing_dipv6_3), \
				args->entries[i].ing_dp); 
			printf("(%u.%u.%u.%u->%u.%u.%u.%u)\n", NIPQUAD(args->entries[i].eg_sipv4), NIPQUAD(args->entries[i].eg_dipv4));
		    }
		} else{
		    printf("unknown packet type! (pkt_type=%d) \n", args->entries[i].pkt_type);
		}
	    }
	    result = args->result;
	    break;
#if defined (CONFIG_HNAT_V2)
    case HW_NAT_DUMP_CACHE_ENTRY:
	    result = HwNatCacheDumpEntry();
	    break;
#endif
    case HW_NAT_DUMP_ENTRY:
	    result = HwNatDumpEntry(entry_num);
	    break;
    case HW_NAT_DEBUG:
	    result = HwNatDebug(debug);
	    break;
#if !defined (CONFIG_HNAT_V2)
    case HW_NAT_DSCP_REMARK:
            HwNatDscpRemarkEbl(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_VPRI_REMARK:
            HwNatVpriRemarkEbl(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_FOE_WEIGHT:
	    HwNatSetFoeWeight(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_ACL_WEIGHT:
	    HwNatSetAclWeight(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_DSCP_WEIGHT:
	    HwNatSetDscpWeight(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_VPRI_WEIGHT:
	    HwNatSetVpriWeight(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_DSCP_UP:
	    HwNatSetDscp_Up(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_UP_IDSCP:
	    HwNatSetUp_InDscp(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_UP_ODSCP:
	    HwNatSetUp_OutDscp(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_UP_VPRI:
	    HwNatSetUp_Vpri(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_UP_AC:
	    HwNatSetUp_Ac(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_SCH_MODE:
	    HwNatSetSchMode(&args3);
	    result = args3.result;
	    break;
    case HW_NAT_SCH_WEIGHT:
	    HwNatSetSchWeight(&args3);
	    result = args3.result;
	    break;
#else
    case HW_NAT_GET_AC_CNT:
	    HwNatGetAGCnt(&args3);
	    printf("Byte cnt=%d\n", args3.ag_byte_cnt);
	    printf("Pkt cnt=%d\n", args3.ag_pkt_cnt);
	    result = args3.result;
	    break;
#endif
    case HW_NAT_BIND_THRESHOLD:
	    HwNatSetBindThreshold(&args4);
	    result = args4.result;
	    break;
    case HW_NAT_MAX_ENTRY_LMT:
	    HwNatSetMaxEntryRateLimit(&args4);
	    result = args4.result;
	    break;
    case HW_NAT_RULE_SIZE:
	    HwNatSetRuleSize(&args4);
	    result = args4.result;
	    break;
    case HW_NAT_KA_INTERVAL:
	    HwNatSetKaInterval(&args4);
	    result = args4.result;
	    break;
    case HW_NAT_UB_LIFETIME:
	    HwNatSetUnbindLifeTime(&args4);
	    result = args4.result;
	    break;
    case HW_NAT_BIND_LIFETIME:
	    HwNatSetBindLifeTime(&args4);
	    result = args4.result;
	    break;
    case HW_NAT_VLAN_ID:
	    result = HwNatSetVID(&args4);
	    break;
    case HW_NAT_BIND_DIRECTION:
	    result = HwNatSetBindDir(&args4);
	    break;
#if defined (CONFIG_PPE_MCAST)
    case HW_NAT_MCAST_INS:
	    result = HwNatMcastIns(&args5);
	    break;
    case HW_NAT_MCAST_DEL:
	    result = HwNatMcastDel(&args5);
	    break;
    case HW_NAT_MCAST_DUMP:
	    result = HwNatMcastDump();
	    break;
#endif

    }

    if(result==HWNAT_SUCCESS){
	printf("done\n");
    }else if(result==HWNAT_ENTRY_NOT_FOUND) {
	printf("entry not found\n");
    }else {
	printf("fail\n");
    }

    free(args);
    return 0;
}
Exemple #2
0
int main(int argc, char *argv[])
{
    int opt;
#if !defined (CONFIG_HNAT_V2)
    char options[] = "efg?c:x:d:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:T:U:V:Z:6:";
#else
    char options[] = "aefg?c:x:d:A:B:C:DN:O:P:Q:T:U:V:Z:6:";
#endif
    int method = -1;
    unsigned int entry_state = 0;
    unsigned int entry_num = 0;
    unsigned int debug = 0;
#if !defined (CONFIG_HNAT_V2)
    struct hwnat_qos_args args3;
#else
    struct hwnat_ac_args args3;
#endif
    struct hwnat_config_args args4;
    int result = 0;

#if defined (CONFIG_PPE_MCAST)
    struct hwnat_mcast_args args5;
    unsigned char mac[6];
#endif

    if(argc < 2) {
	show_usage();
	return 1;
    }

    while ((opt = getopt (argc, argv, options)) != -1) {
	switch (opt) {
	case 'c':
		method = HW_NAT_DUMP_ENTRY;
		entry_num = strtoll(optarg, NULL, 10);
		break;
	case 'x':
		method = HW_NAT_UNBIND_ENTRY;
		entry_num = strtoll(optarg, NULL, 10);
		break;
	case 'd':
		method = HW_NAT_DEBUG;
		debug = strtoll(optarg, NULL, 10);
		break;
	case 'e':
		method = HW_NAT_GET_ALL_ENTRIES;
		entry_state=0; /* invalid entry */
		break;
	case 'f':
		method = HW_NAT_GET_ALL_ENTRIES;
		entry_state=1; /* unbinded entry */
		break;
	case 'g':
		method = HW_NAT_GET_ALL_ENTRIES;
		entry_state=2; /* binded entry */
		break;
#if !defined (CONFIG_HNAT_V2)
	case 'A':
		method = HW_NAT_DSCP_REMARK;
		args3.enable = strtoll(optarg, NULL, 10);
		break;
	case 'B':
		method = HW_NAT_VPRI_REMARK;
		args3.enable = strtoll(optarg, NULL, 10);
		break;
	case 'C':
		method = HW_NAT_FOE_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'D':
		method = HW_NAT_ACL_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'E':
		method = HW_NAT_DSCP_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'F':
		method = HW_NAT_VPRI_WEIGHT;
		args3.weight = strtoll(optarg, NULL, 10);
		break;
	case 'G':
		method = HW_NAT_DSCP_UP;
		args3.dscp_set = strtoll(argv[2], NULL, 10);
		args3.up = strtoll(argv[3], NULL, 10);
		break;
	case 'H':
		method = HW_NAT_UP_IDSCP;
		args3.up = strtoll(argv[2], NULL, 10);
		args3.dscp = strtoll(argv[3], NULL, 10);
		break;
	case 'I':
		method = HW_NAT_UP_ODSCP;
		args3.up = strtoll(argv[2], NULL, 10);
		args3.dscp = strtoll(argv[3], NULL, 10);
		break;
	case 'J':
		method = HW_NAT_UP_VPRI;
		args3.up = strtoll(argv[2], NULL, 10);
		args3.vpri = strtoll(argv[3], NULL, 10);
		break;
	case 'K':
		method = HW_NAT_UP_AC;
		args3.up = strtoll(argv[2], NULL, 10);
		args3.ac = strtoll(argv[3], NULL, 10);
		break;
	case 'L':
		method = HW_NAT_SCH_MODE;
		args3.mode = strtoll(argv[2], NULL, 10);
		break;
	case 'M':
		method = HW_NAT_SCH_WEIGHT;
		args3.weight3 = strtoll(argv[2], NULL, 10);
		args3.weight2 = strtoll(argv[3], NULL, 10);
		args3.weight1 = strtoll(argv[4], NULL, 10);
		args3.weight0 = strtoll(argv[5], NULL, 10);
		break;
#else
	case 'a':
		method = HW_NAT_DUMP_CACHE_ENTRY;
		break;
	case 'A':
		method = HW_NAT_GET_AC_CNT;
		args3.ag_index = strtoll(optarg, NULL, 10);
		break;
#if defined (CONFIG_PPE_MCAST)
	case 'B':
		method = HW_NAT_MCAST_INS;
		args5.mc_vid = strtoll(argv[2], NULL, 10);
		str_to_mac(mac, argv[3]);
		memcpy(args5.dst_mac, mac, sizeof(mac));
		args5.mc_px_en = strtoll(argv[4], NULL, 10);
		args5.mc_px_qos_en = strtoll(argv[5], NULL, 10);
		args5.mc_qos_qid = strtoll(argv[6], NULL, 10);
		break;
	case 'C':
		method = HW_NAT_MCAST_DEL;
		args5.mc_vid = strtoll(argv[2], NULL, 10);
		str_to_mac(mac, argv[3]);
		memcpy(args5.dst_mac, mac, sizeof(mac));
		memcpy(args5.dst_mac, mac, sizeof(mac));
		args5.mc_px_en = strtoll(argv[4], NULL, 10);
		args5.mc_px_qos_en = strtoll(argv[5], NULL, 10);
		break;
	case 'D':
		method = HW_NAT_MCAST_DUMP;
		break;
#endif
#endif
	case 'N':
		method = HW_NAT_BIND_THRESHOLD;
		args4.bind_threshold = strtoll(argv[2], NULL, 10);
		break;
	case 'O':
		method = HW_NAT_MAX_ENTRY_LMT;
		args4.foe_qut_lmt = strtoll(argv[2], NULL, 10);
		args4.foe_half_lmt = strtoll(argv[3], NULL, 10);
		args4.foe_full_lmt  = strtoll(argv[4], NULL, 10);
		break;
	case 'P':
		method = HW_NAT_RULE_SIZE;
		args4.pre_acl    = strtoll(argv[2], NULL, 10);
		args4.pre_meter  = strtoll(argv[3], NULL, 10);
		args4.pre_ac     = strtoll(argv[4], NULL, 10);
		args4.post_meter = strtoll(argv[5], NULL, 10);
		args4.post_ac    = strtoll(argv[6], NULL, 10);
		break;
	case 'Q':
		method = HW_NAT_KA_INTERVAL;
		args4.foe_tcp_ka = strtoll(argv[2], NULL, 10);
		args4.foe_udp_ka = strtoll(argv[3], NULL, 10);
		break;
	case 'T':
		method = HW_NAT_UB_LIFETIME;
		args4.foe_unb_dlta = strtoll(argv[2], NULL, 10);
		break;
	case 'U':
		method = HW_NAT_BIND_LIFETIME;
		args4.foe_tcp_dlta = strtoll(argv[2], NULL, 10);
		args4.foe_udp_dlta = strtoll(argv[3], NULL, 10);
		args4.foe_fin_dlta = strtoll(argv[4], NULL, 10);
		break;
	case 'V':
		method = HW_NAT_VLAN_ID;
		args4.lan_vid = strtoll(argv[2], NULL, 10);
		args4.wan_vid = strtoll(argv[3], NULL, 10);
		break;
	case 'Z':
		method = HW_NAT_BIND_DIRECTION;
		args4.bind_dir = strtoll(optarg, NULL, 10);
		break;
	case '6':
		method = HW_NAT_ALLOW_IPV6;
		args4.foe_allow_ipv6 = strtoll(optarg, NULL, 10);
		break;
	case '?':
		show_usage();
	}
    }

    switch(method){
    case HW_NAT_GET_ALL_ENTRIES:
	    result = HwNatGetAllEntries(entry_state);
	    break;
    case HW_NAT_DUMP_ENTRY:
	    result = HwNatDumpEntry(entry_num);
	    break;
    case HW_NAT_UNBIND_ENTRY:
	    result = HwNatUnBindEntry(entry_num);
	    break;
    case HW_NAT_DEBUG:
	    result = HwNatDebug(debug);
	    break;
#if !defined (CONFIG_HNAT_V2)
    case HW_NAT_DSCP_REMARK:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_VPRI_REMARK:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_FOE_WEIGHT:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_ACL_WEIGHT:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_DSCP_WEIGHT:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_VPRI_WEIGHT:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_DSCP_UP:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_UP_IDSCP:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_UP_ODSCP:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_UP_VPRI:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_UP_AC:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_SCH_MODE:
	    result = HwNatSetQoS(&args3, method);
	    break;
    case HW_NAT_SCH_WEIGHT:
	    result = HwNatSetQoS(&args3, method);
	    break;
#else
    case HW_NAT_DUMP_CACHE_ENTRY:
	    result = HwNatCacheDumpEntry();
	    break;
    case HW_NAT_GET_AC_CNT:
	    result = HwNatGetAGCnt(&args3);
	    break;
#endif
    case HW_NAT_BIND_THRESHOLD:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_MAX_ENTRY_LMT:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_RULE_SIZE:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_KA_INTERVAL:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_UB_LIFETIME:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_BIND_LIFETIME:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_VLAN_ID:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_BIND_DIRECTION:
	    result = HwNatSetConfig(&args4, method);
	    break;
    case HW_NAT_ALLOW_IPV6:
	    result = HwNatSetConfig(&args4, method);
	    break;
#if defined (CONFIG_PPE_MCAST)
    case HW_NAT_MCAST_INS:
	    result = HwNatMcastIns(&args5);
	    break;
    case HW_NAT_MCAST_DEL:
	    result = HwNatMcastDel(&args5);
	    break;
    case HW_NAT_MCAST_DUMP:
	    result = HwNatMcastDump();
	    break;
#endif
    default:
	    result = HWNAT_FAIL;
	    break;
    }

    if (result == HWNAT_SUCCESS){
	printf("done\n");
    } else if(result == HWNAT_ENTRY_NOT_FOUND) {
	printf("entry not found\n");
    } else {
	return 1;
    }

    return 0;
}
Exemple #3
0
int main(int argc, char *argv[])
{
    int opt;
#if !defined (CONFIG_HNAT_V2)
    char options[] = "efg?c:d:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:T:U:V:Y:Z:6:";
#else
    char options[] = "aefg?c:d:A:N:O:P:Q:T:U:V:Y:Z:6:";
#endif
    int method;
    int i=0;
    unsigned int entry_num;
    unsigned int debug;
    struct hwnat_args *args;
#if !defined (CONFIG_HNAT_V2)
    struct hwnat_qos_args args3;
#else
    struct hwnat_ac_args args3;
#endif
    struct hwnat_config_args args4;
    int	   result;

    if(argc < 2) {
        show_usage();
        return 0;
    }

    /* Max table size is 16K */
    args=malloc(sizeof(struct hwnat_args)+sizeof(struct hwnat_tuple)*1024*16);

    while ((opt = getopt (argc, argv, options)) != -1) {
        switch (opt) {
#if defined (CONFIG_HNAT_V2)
        case 'a':
            method = HW_NAT_DUMP_CACHE_ENTRY;
            break;
#endif
        case 'c':
            method = HW_NAT_DUMP_ENTRY;
            entry_num = strtoll(optarg, NULL, 10);
            break;
        case 'd':
            method = HW_NAT_DEBUG;
            debug = strtoll(optarg, NULL, 10);
            break;
        case 'e':
            method = HW_NAT_GET_ALL_ENTRIES;
            args->entry_state=0; /* invalid entry */
            break;
        case 'f':
            method = HW_NAT_GET_ALL_ENTRIES;
            args->entry_state=1; /* unbinded entry */
            break;
        case 'g':
            method = HW_NAT_GET_ALL_ENTRIES;
            args->entry_state=2; /* binded entry */
            break;
#if !defined (CONFIG_HNAT_V2)
        case 'A':
            method = HW_NAT_DSCP_REMARK;
            args3.enable = strtoll(optarg, NULL, 10);
            break;
        case 'B':
            method = HW_NAT_VPRI_REMARK;
            args3.enable = strtoll(optarg, NULL, 10);
            break;
        case 'C':
            method = HW_NAT_FOE_WEIGHT;
            args3.weight = strtoll(optarg, NULL, 10);
            break;
        case 'D':
            method = HW_NAT_ACL_WEIGHT;
            args3.weight = strtoll(optarg, NULL, 10);
            break;
        case 'E':
            method = HW_NAT_DSCP_WEIGHT;
            args3.weight = strtoll(optarg, NULL, 10);
            break;
        case 'F':
            method = HW_NAT_VPRI_WEIGHT;
            args3.weight = strtoll(optarg, NULL, 10);
            break;
        case 'G':
            method = HW_NAT_DSCP_UP;
            args3.dscp_set = strtoll(argv[2], NULL, 10);
            args3.up = strtoll(argv[3], NULL, 10);
            break;
        case 'H':
            method = HW_NAT_UP_IDSCP;

            args3.up = strtoll(argv[2], NULL, 10);
            args3.dscp = strtoll(argv[3], NULL, 10);
            break;
        case 'I':
            method = HW_NAT_UP_ODSCP;
            args3.up = strtoll(argv[2], NULL, 10);
            args3.dscp = strtoll(argv[3], NULL, 10);
            break;
        case 'J':
            method = HW_NAT_UP_VPRI;
            args3.up = strtoll(argv[2], NULL, 10);
            args3.vpri = strtoll(argv[3], NULL, 10);
            break;
        case 'K':
            method = HW_NAT_UP_AC;
            args3.up = strtoll(argv[2], NULL, 10);
            args3.ac = strtoll(argv[3], NULL, 10);
            break;
        case 'L':
            method = HW_NAT_SCH_MODE;
            args3.mode = strtoll(argv[2], NULL, 10);
            break;
        case 'M':
            method = HW_NAT_SCH_WEIGHT;
            args3.weight3 = strtoll(argv[2], NULL, 10);
            args3.weight2 = strtoll(argv[3], NULL, 10);
            args3.weight1 = strtoll(argv[4], NULL, 10);
            args3.weight0 = strtoll(argv[5], NULL, 10);
            break;
#else
        case 'A':
            method = HW_NAT_GET_AC_CNT;
            args3.ag_index = strtoll(optarg, NULL, 10);
            break;
#endif
        case 'N':
            method = HW_NAT_BIND_THRESHOLD;
            args4.bind_threshold = strtoll(argv[2], NULL, 10);
            break;
        case 'O':
            method = HW_NAT_MAX_ENTRY_LMT;
            args4.foe_qut_lmt = strtoll(argv[2], NULL, 10);
            args4.foe_half_lmt = strtoll(argv[3], NULL, 10);
            args4.foe_full_lmt  = strtoll(argv[4], NULL, 10);
            break;
        case 'P':
            method = HW_NAT_RULE_SIZE;
            args4.pre_acl    = strtoll(argv[2], NULL, 10);
            args4.pre_meter  = strtoll(argv[3], NULL, 10);
            args4.pre_ac     = strtoll(argv[4], NULL, 10);
            args4.post_meter = strtoll(argv[5], NULL, 10);
            args4.post_ac    = strtoll(argv[6], NULL, 10);
            break;
        case 'Q':
            method = HW_NAT_KA_INTERVAL;
            args4.foe_tcp_ka = strtoll(argv[2], NULL, 10);
            args4.foe_udp_ka = strtoll(argv[3], NULL, 10);
            break;
        case 'T':
            method = HW_NAT_UB_LIFETIME;
            args4.foe_unb_dlta = strtoll(argv[2], NULL, 10);
            break;
        case 'U':
            method = HW_NAT_BIND_LIFETIME;
            args4.foe_tcp_dlta = strtoll(argv[2], NULL, 10);
            args4.foe_udp_dlta = strtoll(argv[3], NULL, 10);
            args4.foe_fin_dlta = strtoll(argv[4], NULL, 10);
            break;
        case 'V':
            method = HW_NAT_VLAN_ID;
            args4.lan_vid = strtoll(argv[2], NULL, 10);
            args4.wan_vid = strtoll(argv[3], NULL, 10);
            break;
        case 'Y':
            method = HW_NAT_ALLOW_UDP;
            args4.foe_allow_udp = strtoll(optarg, NULL, 10);
            break;
        case 'Z':
            method = HW_NAT_BIND_DIRECTION;
            args4.bind_dir = strtoll(optarg, NULL, 10);
            break;
        case '6':
            method = HW_NAT_ALLOW_IPV6;
            args4.foe_allow_ipv6 = strtoll(optarg, NULL, 10);
            break;
        case '?':
            show_usage();
        }
    }

    switch(method) {
    case HW_NAT_GET_ALL_ENTRIES:
        HwNatGetAllEntries(args);

        printf("Total Entry Count = %d\n",args->num_of_entries);
        for(i=0; i<args->num_of_entries; i++) {
            if(args->entries[i].pkt_type==0) { //IPV4_NAPT
                printf("IPv4_NAPT=%d : %u.%u.%u.%u:%d->%u.%u.%u.%u:%d => %u.%u.%u.%u:%d->%u.%u.%u.%u:%d\n", \
                       args->entries[i].hash_index, \
                       NIPQUAD(args->entries[i].ing_sipv4), \
                       args->entries[i].ing_sp, \
                       NIPQUAD(args->entries[i].ing_dipv4), \
                       args->entries[i].ing_dp, \
                       NIPQUAD(args->entries[i].eg_sipv4), \
                       args->entries[i].eg_sp, \
                       NIPQUAD(args->entries[i].eg_dipv4), \
                       args->entries[i].eg_dp);
            } else if(args->entries[i].pkt_type==1) { //IPV4_NAT
                printf("IPv4_NAT=%d : %u.%u.%u.%u->%u.%u.%u.%u => %u.%u.%u.%u->%u.%u.%u.%u\n", \
                       args->entries[i].hash_index, \
                       NIPQUAD(args->entries[i].ing_sipv4), \
                       NIPQUAD(args->entries[i].ing_dipv4), \
                       NIPQUAD(args->entries[i].eg_sipv4), \
                       NIPQUAD(args->entries[i].eg_dipv4));
            } else if(args->entries[i].pkt_type==2) { //IPV6_ROUTING
                printf("IPv6_1T=%d /DIP: %x:%x:%x:%x:%x:%x:%x:%x\n", \
                       args->entries[i].hash_index, \
                       NIPHALF(args->entries[i].ing_dipv6_0), \
                       NIPHALF(args->entries[i].ing_dipv6_1), \
                       NIPHALF(args->entries[i].ing_dipv6_2), \
                       NIPHALF(args->entries[i].ing_dipv6_3));
            } else if(args->entries[i].pkt_type==3) { //IPV4_DSLITE
                printf("DS-Lite=%d : %u.%u.%u.%u:%d->%u.%u.%u.%u:%d (%x:%x:%x:%x:%x:%x:%x:%x -> %x:%x:%x:%x:%x:%x:%x:%x) \n", \
                       args->entries[i].hash_index, \
                       NIPQUAD(args->entries[i].ing_sipv4),  \
                       args->entries[i].ing_sp,     \
                       NIPQUAD(args->entries[i].ing_dipv4),  \
                       args->entries[i].ing_dp, \
                       NIPHALF(args->entries[i].eg_sipv6_0), \
                       NIPHALF(args->entries[i].eg_sipv6_1), \
                       NIPHALF(args->entries[i].eg_sipv6_2), \
                       NIPHALF(args->entries[i].eg_sipv6_3), \
                       NIPHALF(args->entries[i].eg_dipv6_0), \
                       NIPHALF(args->entries[i].eg_dipv6_1), \
                       NIPHALF(args->entries[i].eg_dipv6_2), \
                       NIPHALF(args->entries[i].eg_dipv6_3));
            } else if(args->entries[i].pkt_type==4) { //IPV6_3T_ROUTE
                printf("IPv6_3T=%d SIP: %x:%x:%x:%x:%x:%x:%x:%x DIP: %x:%x:%x:%x:%x:%x:%x:%x\n", \
                       args->entries[i].hash_index, \
                       NIPHALF(args->entries[i].ing_sipv6_0), \
                       NIPHALF(args->entries[i].ing_sipv6_1), \
                       NIPHALF(args->entries[i].ing_sipv6_2), \
                       NIPHALF(args->entries[i].ing_sipv6_3), \
                       NIPHALF(args->entries[i].ing_dipv6_0), \
                       NIPHALF(args->entries[i].ing_dipv6_1), \
                       NIPHALF(args->entries[i].ing_dipv6_2), \
                       NIPHALF(args->entries[i].ing_dipv6_3));
            } else if(args->entries[i].pkt_type==5) { //IPV6_5T_ROUTE
                if(args->entries[i].ipv6_flowlabel==1) {
                    printf("IPv6_5T=%d SIP: %x:%x:%x:%x:%x:%x:%x:%x DIP: %x:%x:%x:%x:%x:%x:%x:%x (Flow Label=%x)\n", \
                           args->entries[i].hash_index, \
                           NIPHALF(args->entries[i].ing_sipv6_0), \
                           NIPHALF(args->entries[i].ing_sipv6_1), \
                           NIPHALF(args->entries[i].ing_sipv6_2), \
                           NIPHALF(args->entries[i].ing_sipv6_3), \
                           NIPHALF(args->entries[i].ing_dipv6_0), \
                           NIPHALF(args->entries[i].ing_dipv6_1), \
                           NIPHALF(args->entries[i].ing_dipv6_2), \
                           NIPHALF(args->entries[i].ing_dipv6_3), \
                           ((args->entries[i].ing_sp << 16) | (args->entries[i].ing_dp))&0xFFFFF);
                } else {
                    printf("IPv6_5T=%d SIP: %x:%x:%x:%x:%x:%x:%x:%x (SP:%d) DIP: %x:%x:%x:%x:%x:%x:%x:%x (DP=%d)\n", \
                           args->entries[i].hash_index, \
                           NIPHALF(args->entries[i].ing_sipv6_0), \
                           NIPHALF(args->entries[i].ing_sipv6_1), \
                           NIPHALF(args->entries[i].ing_sipv6_2), \
                           NIPHALF(args->entries[i].ing_sipv6_3), \
                           args->entries[i].ing_sp, \
                           NIPHALF(args->entries[i].ing_dipv6_0), \
                           NIPHALF(args->entries[i].ing_dipv6_1), \
                           NIPHALF(args->entries[i].ing_dipv6_2), \
                           NIPHALF(args->entries[i].ing_dipv6_3), \
                           args->entries[i].ing_dp);
                }

            } else if(args->entries[i].pkt_type==7) { //IPV6_6RD
                if(args->entries[i].ipv6_flowlabel==1) {
                    printf("6RD=%d %x:%x:%x:%x:%x:%x:%x:%x->%x:%x:%x:%x:%x:%x:%x:%x [Flow Label=%x]\n", \
                           args->entries[i].hash_index, \
                           NIPHALF(args->entries[i].ing_sipv6_0), \
                           NIPHALF(args->entries[i].ing_sipv6_1), \
                           NIPHALF(args->entries[i].ing_sipv6_2), \
                           NIPHALF(args->entries[i].ing_sipv6_3), \
                           NIPHALF(args->entries[i].ing_dipv6_0), \
                           NIPHALF(args->entries[i].ing_dipv6_1), \
                           NIPHALF(args->entries[i].ing_dipv6_2), \
                           NIPHALF(args->entries[i].ing_dipv6_3), \
                           ((args->entries[i].ing_sp << 16) | (args->entries[i].ing_dp))&0xFFFFF);
                    printf("(%u.%u.%u.%u->%u.%u.%u.%u)\n", NIPQUAD(args->entries[i].eg_sipv4), NIPQUAD(args->entries[i].eg_dipv4));
                } else {
                    printf("6RD=%d /SIP: %x:%x:%x:%x:%x:%x:%x:%x [SP:%d] /DIP: %x:%x:%x:%x:%x:%x:%x:%x [DP=%d]", \
                           args->entries[i].hash_index, \
                           NIPHALF(args->entries[i].ing_sipv6_0), \
                           NIPHALF(args->entries[i].ing_sipv6_1), \
                           NIPHALF(args->entries[i].ing_sipv6_2), \
                           NIPHALF(args->entries[i].ing_sipv6_3), \
                           args->entries[i].ing_sp, \
                           NIPHALF(args->entries[i].ing_dipv6_0), \
                           NIPHALF(args->entries[i].ing_dipv6_1), \
                           NIPHALF(args->entries[i].ing_dipv6_2), \
                           NIPHALF(args->entries[i].ing_dipv6_3), \
                           args->entries[i].ing_dp);
                    printf("(%u.%u.%u.%u->%u.%u.%u.%u)\n", NIPQUAD(args->entries[i].eg_sipv4), NIPQUAD(args->entries[i].eg_dipv4));
                }
            } else {
                printf("unknown packet type! (pkt_type=%d) \n", args->entries[i].pkt_type);
            }
        }
        result = args->result;
        break;
#if defined (CONFIG_HNAT_V2)
    case HW_NAT_DUMP_CACHE_ENTRY:
        result = HwNatCacheDumpEntry();
        break;
#endif
    case HW_NAT_DUMP_ENTRY:
        result = HwNatDumpEntry(entry_num);
        break;
    case HW_NAT_DEBUG:
        result = HwNatDebug(debug);
        break;
#if !defined (CONFIG_HNAT_V2)
    case HW_NAT_DSCP_REMARK:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_VPRI_REMARK:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_FOE_WEIGHT:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_ACL_WEIGHT:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_DSCP_WEIGHT:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_VPRI_WEIGHT:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_DSCP_UP:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_UP_IDSCP:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_UP_ODSCP:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_UP_VPRI:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_UP_AC:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_SCH_MODE:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
    case HW_NAT_SCH_WEIGHT:
        HwNatSetQoS(&args3, method);
        result = args3.result;
        break;
#else
    case HW_NAT_GET_AC_CNT:
        HwNatGetAGCnt(&args3);
        printf("Byte cnt=%d\n", args3.ag_byte_cnt);
        printf("Pkt cnt=%d\n", args3.ag_pkt_cnt);
        result = args3.result;
        break;
#endif
    case HW_NAT_BIND_THRESHOLD:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_MAX_ENTRY_LMT:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_RULE_SIZE:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_KA_INTERVAL:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_UB_LIFETIME:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_BIND_LIFETIME:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_VLAN_ID:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_BIND_DIRECTION:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_ALLOW_UDP:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    case HW_NAT_ALLOW_IPV6:
        HwNatSetConfig(&args4, method);
        result = args4.result;
        break;
    }

    if(result==HWNAT_SUCCESS) {
        printf("done\n");
    } else if(result==HWNAT_ENTRY_NOT_FOUND) {
        printf("entry not found\n");
    } else {
        printf("fail\n");
    }

    free(args);
    return 0;
}