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; }
/* * 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; }