コード例 #1
0
ファイル: jool.c プロジェクト: npowern/NAT64
static int set_general_u16_array(struct arguments *args, enum general_module module, int type,
		char *value)
{
	__u16* array;
	size_t array_len;
	int error;

	error = str_to_u16_array(value, &array, &array_len);
	if (error)
		return error;

	error = set_general_arg(args, module, type, array_len * sizeof(*array), array);
	free(array);
	return error;
}
コード例 #2
0
ファイル: nat64.c プロジェクト: edygarza/NAT64
/*
 * PARSER. Field 2 in ARGP.
 */
static int parse_opt(int key, char *arg, struct argp_state *state)
{
	struct arguments *arguments = state->input;
	int error = 0;
	__u16 temp;

	switch (key) {
	case ARGP_POOL6:
		arguments->mode = MODE_POOL6;
		break;
	case ARGP_POOL4:
		arguments->mode = MODE_POOL4;
		break;
	case ARGP_BIB:
		arguments->mode = MODE_BIB;
		break;
	case ARGP_SESSION:
		arguments->mode = MODE_SESSION;
		break;
	case ARGP_FILTERING:
		arguments->mode = MODE_FILTERING;
		break;
	case ARGP_TRANSLATE:
		arguments->mode = MODE_TRANSLATE;
		break;

	case ARGP_DISPLAY:
		arguments->operation = OP_DISPLAY;
		break;
	case ARGP_ADD:
		arguments->operation = OP_ADD;
		break;
	case ARGP_REMOVE:
		arguments->operation = OP_REMOVE;
		break;

	case ARGP_UDP:
		arguments->udp = true;
		break;
	case ARGP_TCP:
		arguments->tcp = true;
		break;
	case ARGP_ICMP:
		arguments->icmp = true;
		break;

	case ARGP_ADDRESS:
		error = str_to_addr4(arg, &arguments->pool4_addr);
		arguments->pool4_addr_set = true;
		break;
	case ARGP_PREFIX:
		error = str_to_prefix(arg, &arguments->pool6_prefix);
		arguments->pool6_prefix_set = true;
		break;
//	case ARGP_STATIC:
//		arguments->static_entries = true;
//		break;
//	case ARGP_DYNAMIC:
//		arguments->dynamic_entries = true;
//		break;
//
//	case ARGP_IPV6:
//		error = str_to_addr6_port(arg, &arguments->bib_addr6);
//		arguments->bib_addr6_set = true;
//		break;
//	case ARGP_IPV4:
//		error = str_to_addr4_port(arg, &arguments->bib_addr4);
//		arguments->bib_addr4_set = true;
//		break;
	case ARGP_REMOTE6:
		error = str_to_addr6_port(arg, &arguments->session_pair6.remote);
		arguments->session_pair6_remote_set = true;
		break;
	case ARGP_LOCAL6:
		error = str_to_addr6_port(arg, &arguments->session_pair6.local);
		arguments->session_pair6_local_set = true;
		break;
	case ARGP_LOCAL4:
		error = str_to_addr4_port(arg, &arguments->session_pair4.local);
		arguments->session_pair4_local_set = true;
		break;
	case ARGP_REMOTE4:
		error = str_to_addr4_port(arg, &arguments->session_pair4.remote);
		arguments->session_pair4_remote_set = true;
		break;

	case ARGP_DROP_ADDR:
		arguments->mode = MODE_FILTERING;
		arguments->operation |= DROP_BY_ADDR_MASK;
		error = str_to_bool(arg, &arguments->filtering.drop_by_addr);
		break;
	case ARGP_DROP_INFO:
		arguments->mode = MODE_FILTERING;
		arguments->operation |= DROP_ICMP6_INFO_MASK;
		error = str_to_bool(arg, &arguments->filtering.drop_icmp6_info);
		break;
//	case ARGP_DROP_TCP:
//		arguments->mode = MODE_FILTERING;
//		arguments->operation |= DROP_EXTERNAL_TCP_MASK;
//		error = str_to_bool(arg, &arguments->filtering.drop_external_tcp);
//		break;
	case ARGP_UDP_TO:
		arguments->mode = MODE_FILTERING;
		arguments->operation |= UDP_TIMEOUT_MASK;
		error = str_to_u16(arg, &temp, UDP_MIN, 0xFFFF);
		arguments->filtering.to.udp = temp;
		break;
	case ARGP_ICMP_TO:
		arguments->mode = MODE_FILTERING;
		arguments->operation |= ICMP_TIMEOUT_MASK;
		error = str_to_u16(arg, &temp, 0, 0xFFFF);
		arguments->filtering.to.icmp = temp;
		break;
	case ARGP_TCP_TO:
		arguments->mode = MODE_FILTERING;
		arguments->operation |= TCP_EST_TIMEOUT_MASK;
		error = str_to_u16(arg, &temp, TCP_EST, 0xFFFF);
		arguments->filtering.to.tcp_est = temp;
		break;
	case ARGP_TCP_TRANS_TO:
		arguments->mode = MODE_FILTERING;
		arguments->operation |= TCP_TRANS_TIMEOUT_MASK;
		error = str_to_u16(arg, &temp, TCP_TRANS, 0xFFFF);
		arguments->filtering.to.tcp_trans = temp;
		break;

	case ARGP_HEAD:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= SKB_HEAD_ROOM_MASK;
		error = str_to_u16(arg, &arguments->translate.skb_head_room, 0, 0xFFFF);
		break;
	case ARGP_TAIL:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= SKB_TAIL_ROOM_MASK;
		error = str_to_u16(arg, &arguments->translate.skb_tail_room, 0, 0xFFFF);
		break;
	case ARGP_RESET_TCLASS:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= RESET_TCLASS_MASK;
		error = str_to_bool(arg, &arguments->translate.reset_traffic_class);
		break;
	case ARGP_RESET_TOS:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= RESET_TOS_MASK;
		error = str_to_bool(arg, &arguments->translate.reset_tos);
		break;
	case ARGP_NEW_TOS:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= NEW_TOS_MASK;
		error = str_to_u8(arg, &arguments->translate.new_tos, 0, 0xFF);
		break;
	case ARGP_DF:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= DF_ALWAYS_ON_MASK;
		error = str_to_bool(arg, &arguments->translate.df_always_on);
		break;
	case ARGP_BUILD_ID:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= BUILD_IPV4_ID_MASK;
		error = str_to_bool(arg, &arguments->translate.build_ipv4_id);
		break;
	case ARGP_LOWER_MTU_FAIL:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= LOWER_MTU_FAIL_MASK;
		error = str_to_bool(arg, &arguments->translate.lower_mtu_fail);
		break;
	case ARGP_NEXT_MTU6:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= IPV6_NEXTHOP_MTU_MASK;
		error = str_to_u16(arg, &arguments->translate.ipv6_nexthop_mtu, 0, 0xFFFF);
		break;
	case ARGP_NEXT_MTU4:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= IPV4_NEXTHOP_MTU_MASK;
		error = str_to_u16(arg, &arguments->translate.ipv4_nexthop_mtu, 0, 0xFFFF);
		break;
	case ARGP_PLATEAUS:
		arguments->mode = MODE_TRANSLATE;
		arguments->operation |= MTU_PLATEAUS_MASK;
		error = str_to_u16_array(arg, &arguments->translate.mtu_plateaus,
				&arguments->translate.mtu_plateau_count);
		break;

	default:
		return ARGP_ERR_UNKNOWN;
	}

	return error;
}