ikev2: support ipv6 traffic selectors & overlay
Ticket: VPP-1917 Type: feature Change-Id: Ie9f22e7336aa7807b1967c48de9843df10fb575c Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
This commit is contained in:
committed by
Beno�t Ganne
parent
7b4e52f88f
commit
84962d19ba
@@ -264,7 +264,7 @@ autoreply define ikev2_profile_set_ts
|
||||
|
||||
string name[64];
|
||||
vl_api_ikev2_ts_t ts;
|
||||
option vat_help = "name <profile_name> protocol <proto> start_port <port> end_port <port> start_addr <ip4> end_addr <ip4> (local|remote)";
|
||||
option vat_help = "name <profile_name> protocol <proto> start_port <port> end_port <port> start_addr <ip> end_addr <ip> (local|remote)";
|
||||
option status="in_progress";
|
||||
};
|
||||
|
||||
|
||||
+358
-170
File diff suppressed because it is too large
Load Diff
@@ -369,6 +369,12 @@ typedef enum
|
||||
#undef _
|
||||
} ikev2_id_type_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TS_IPV4_ADDR_RANGE = 7,
|
||||
TS_IPV6_ADDR_RANGE = 8,
|
||||
} ikev2_traffic_selector_type_t;
|
||||
|
||||
clib_error_t *ikev2_init (vlib_main_t * vm);
|
||||
clib_error_t *ikev2_set_local_key (vlib_main_t * vm, u8 * file);
|
||||
clib_error_t *ikev2_add_del_profile (vlib_main_t * vm, u8 * name, int is_add);
|
||||
@@ -379,11 +385,11 @@ clib_error_t *ikev2_set_profile_id (vlib_main_t * vm, u8 * name,
|
||||
u8 id_type, u8 * data, int is_local);
|
||||
clib_error_t *ikev2_set_profile_ts (vlib_main_t * vm, u8 * name,
|
||||
u8 protocol_id, u16 start_port,
|
||||
u16 end_port, ip4_address_t start_addr,
|
||||
ip4_address_t end_addr, int is_local);
|
||||
u16 end_port, ip_address_t start_addr,
|
||||
ip_address_t end_addr, int is_local);
|
||||
clib_error_t *ikev2_set_profile_responder (vlib_main_t * vm, u8 * name,
|
||||
u32 sw_if_index,
|
||||
ip4_address_t ip4);
|
||||
ip_address_t addr);
|
||||
clib_error_t *ikev2_set_profile_ike_transforms (vlib_main_t * vm, u8 * name,
|
||||
ikev2_transform_encr_type_t
|
||||
crypto_alg,
|
||||
|
||||
@@ -98,8 +98,8 @@ cp_ts (vl_api_ikev2_ts_t * vl_api_ts, ikev2_ts_t * ts, u8 is_local)
|
||||
vl_api_ts->protocol_id = ts->protocol_id;
|
||||
vl_api_ts->start_port = ts->start_port;
|
||||
vl_api_ts->end_port = ts->end_port;
|
||||
ip4_address_encode (&ts->start_addr, vl_api_ts->start_addr);
|
||||
ip4_address_encode (&ts->end_addr, vl_api_ts->end_addr);
|
||||
ip_address_encode2 (&ts->start_addr, &vl_api_ts->start_addr);
|
||||
ip_address_encode2 (&ts->end_addr, &vl_api_ts->end_addr);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -116,7 +116,7 @@ cp_responder (vl_api_ikev2_responder_t * vl_api_responder,
|
||||
ikev2_responder_t * responder)
|
||||
{
|
||||
vl_api_responder->sw_if_index = responder->sw_if_index;
|
||||
ip4_address_encode (&responder->ip4, vl_api_responder->ip4);
|
||||
ip_address_encode2 (&responder->addr, &vl_api_responder->addr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -208,8 +208,8 @@ send_sa (ikev2_sa_t * sa, vl_api_ikev2_sa_dump_t * mp, u32 api_sa_index)
|
||||
vl_api_ikev2_keys_t* k = &rsa->keys;
|
||||
rsa->profile_index = rsa->profile_index;
|
||||
rsa->sa_index = api_sa_index;
|
||||
ip4_address_encode (&sa->iaddr, rsa->iaddr);
|
||||
ip4_address_encode (&sa->raddr, rsa->raddr);
|
||||
ip_address_encode2 (&sa->iaddr, &rsa->iaddr);
|
||||
ip_address_encode2 (&sa->raddr, &rsa->raddr);
|
||||
rsa->ispi = sa->ispi;
|
||||
rsa->rspi = sa->rspi;
|
||||
cp_id(&rsa->i_id, &sa->i_id);
|
||||
@@ -593,9 +593,9 @@ vl_api_ikev2_profile_set_ts_t_handler (vl_api_ikev2_profile_set_ts_t * mp)
|
||||
vlib_main_t *vm = vlib_get_main ();
|
||||
clib_error_t *error;
|
||||
u8 *tmp = format (0, "%s", mp->name);
|
||||
ip4_address_t start_addr, end_addr;
|
||||
ip4_address_decode (mp->ts.start_addr, &start_addr);
|
||||
ip4_address_decode (mp->ts.end_addr, &end_addr);
|
||||
ip_address_t start_addr, end_addr;
|
||||
ip_address_decode2 (&mp->ts.start_addr, &start_addr);
|
||||
ip_address_decode2 (&mp->ts.end_addr, &end_addr);
|
||||
error =
|
||||
ikev2_set_profile_ts (vm, tmp, mp->ts.protocol_id,
|
||||
clib_net_to_host_u16 (mp->ts.start_port),
|
||||
@@ -642,11 +642,11 @@ vl_api_ikev2_set_responder_t_handler (vl_api_ikev2_set_responder_t * mp)
|
||||
clib_error_t *error;
|
||||
|
||||
u8 *tmp = format (0, "%s", mp->name);
|
||||
ip4_address_t ip4;
|
||||
ip4_address_decode (mp->responder.ip4, &ip4);
|
||||
ip_address_t ip;
|
||||
ip_address_decode2 (&mp->responder.addr, &ip);
|
||||
u32 sw_if_index = clib_net_to_host_u32 (mp->responder.sw_if_index);
|
||||
|
||||
error = ikev2_set_profile_responder (vm, tmp, sw_if_index, ip4);
|
||||
error = ikev2_set_profile_responder (vm, tmp, sw_if_index, ip);
|
||||
vec_free (tmp);
|
||||
if (error)
|
||||
rv = VNET_API_ERROR_UNSPECIFIED;
|
||||
|
||||
@@ -55,8 +55,8 @@ format_ikev2_traffic_selector (u8 * s, va_list * va)
|
||||
s = format (s, "%u type %u protocol_id %u addr "
|
||||
"%U - %U port %u - %u\n",
|
||||
index, ts->ts_type, ts->protocol_id,
|
||||
format_ip4_address, &ts->start_addr,
|
||||
format_ip4_address, &ts->end_addr,
|
||||
format_ip_address, &ts->start_addr,
|
||||
format_ip_address, &ts->end_addr,
|
||||
clib_net_to_host_u16 (ts->start_port),
|
||||
clib_net_to_host_u16 (ts->end_port));
|
||||
return s;
|
||||
@@ -127,8 +127,8 @@ format_ikev2_sa (u8 * s, va_list * va)
|
||||
u32 indent = 1;
|
||||
|
||||
s = format (s, "iip %U ispi %lx rip %U rspi %lx",
|
||||
format_ip4_address, &sa->iaddr, sa->ispi,
|
||||
format_ip4_address, &sa->raddr, sa->rspi);
|
||||
format_ip_address, &sa->iaddr, sa->ispi,
|
||||
format_ip_address, &sa->raddr, sa->rspi);
|
||||
if (!details)
|
||||
return s;
|
||||
|
||||
@@ -279,11 +279,9 @@ ikev2_profile_add_del_command_fn (vlib_main_t * vm,
|
||||
u8 *data = 0;
|
||||
u32 tmp1, tmp2, tmp3;
|
||||
u64 tmp4, tmp5;
|
||||
ip4_address_t ip4;
|
||||
ip4_address_t end_addr;
|
||||
ip_address_t ip, end_addr;
|
||||
u32 responder_sw_if_index = (u32) ~ 0;
|
||||
u32 tun_sw_if_index = (u32) ~ 0;
|
||||
ip4_address_t responder_ip4;
|
||||
ikev2_transform_encr_type_t crypto_alg;
|
||||
ikev2_transform_integ_type_t integ_alg;
|
||||
ikev2_transform_dh_type_t dh_type;
|
||||
@@ -333,10 +331,10 @@ ikev2_profile_add_del_command_fn (vlib_main_t * vm,
|
||||
else if (unformat (line_input, "set %U id local %U %U",
|
||||
unformat_ikev2_token, &name,
|
||||
unformat_ikev2_id_type, &id_type,
|
||||
unformat_ip4_address, &ip4))
|
||||
unformat_ip_address, &ip))
|
||||
{
|
||||
data = vec_new (u8, 4);
|
||||
clib_memcpy (data, ip4.as_u8, 4);
|
||||
data = vec_new (u8, ip_address_size (&ip));
|
||||
clib_memcpy (data, ip_addr_bytes (&ip), ip_address_size (&ip));
|
||||
r =
|
||||
ikev2_set_profile_id (vm, name, (u8) id_type, data, /*local */ 1);
|
||||
goto done;
|
||||
@@ -361,10 +359,10 @@ ikev2_profile_add_del_command_fn (vlib_main_t * vm,
|
||||
else if (unformat (line_input, "set %U id remote %U %U",
|
||||
unformat_ikev2_token, &name,
|
||||
unformat_ikev2_id_type, &id_type,
|
||||
unformat_ip4_address, &ip4))
|
||||
unformat_ip_address, &ip))
|
||||
{
|
||||
data = vec_new (u8, 4);
|
||||
clib_memcpy (data, ip4.as_u8, 4);
|
||||
data = vec_new (u8, ip_address_size (&ip));
|
||||
clib_memcpy (data, ip_addr_bytes (&ip), ip_address_size (&ip));
|
||||
r = ikev2_set_profile_id (vm, name, (u8) id_type, data, /*remote */
|
||||
0);
|
||||
goto done;
|
||||
@@ -389,36 +387,32 @@ ikev2_profile_add_del_command_fn (vlib_main_t * vm,
|
||||
else if (unformat (line_input, "set %U traffic-selector local "
|
||||
"ip-range %U - %U port-range %u - %u protocol %u",
|
||||
unformat_ikev2_token, &name,
|
||||
unformat_ip4_address, &ip4,
|
||||
unformat_ip4_address, &end_addr,
|
||||
&tmp1, &tmp2, &tmp3))
|
||||
unformat_ip_address, &ip,
|
||||
unformat_ip_address, &end_addr, &tmp1, &tmp2, &tmp3))
|
||||
{
|
||||
r =
|
||||
ikev2_set_profile_ts (vm, name, (u8) tmp3, (u16) tmp1, (u16) tmp2,
|
||||
ip4, end_addr, /*local */ 1);
|
||||
ip, end_addr, /*local */ 1);
|
||||
goto done;
|
||||
}
|
||||
else if (unformat (line_input, "set %U traffic-selector remote "
|
||||
"ip-range %U - %U port-range %u - %u protocol %u",
|
||||
unformat_ikev2_token, &name,
|
||||
unformat_ip4_address, &ip4,
|
||||
unformat_ip4_address, &end_addr,
|
||||
&tmp1, &tmp2, &tmp3))
|
||||
unformat_ip_address, &ip,
|
||||
unformat_ip_address, &end_addr, &tmp1, &tmp2, &tmp3))
|
||||
{
|
||||
r =
|
||||
ikev2_set_profile_ts (vm, name, (u8) tmp3, (u16) tmp1, (u16) tmp2,
|
||||
ip4, end_addr, /*remote */ 0);
|
||||
ip, end_addr, /*remote */ 0);
|
||||
goto done;
|
||||
}
|
||||
else if (unformat (line_input, "set %U responder %U %U",
|
||||
unformat_ikev2_token, &name,
|
||||
unformat_vnet_sw_interface, vnm,
|
||||
&responder_sw_if_index, unformat_ip4_address,
|
||||
&responder_ip4))
|
||||
&responder_sw_if_index, unformat_ip_address, &ip))
|
||||
{
|
||||
r =
|
||||
ikev2_set_profile_responder (vm, name, responder_sw_if_index,
|
||||
responder_ip4);
|
||||
ikev2_set_profile_responder (vm, name, responder_sw_if_index, ip);
|
||||
goto done;
|
||||
}
|
||||
else if (unformat (line_input, "set %U tunnel %U",
|
||||
@@ -565,7 +559,7 @@ show_ikev2_profile_command_fn (vlib_main_t * vm,
|
||||
if (p->loc_id.type == IKEV2_ID_TYPE_ID_IPV4_ADDR)
|
||||
vlib_cli_output(vm, " local id-type %U data %U",
|
||||
format_ikev2_id_type, p->loc_id.type,
|
||||
format_ip4_address, p->loc_id.data);
|
||||
format_ip_address, p->loc_id.data);
|
||||
else if (p->loc_id.type == IKEV2_ID_TYPE_ID_KEY_ID)
|
||||
vlib_cli_output(vm, " local id-type %U data 0x%U",
|
||||
format_ikev2_id_type, p->loc_id.type,
|
||||
@@ -581,7 +575,7 @@ show_ikev2_profile_command_fn (vlib_main_t * vm,
|
||||
if (p->rem_id.type == IKEV2_ID_TYPE_ID_IPV4_ADDR)
|
||||
vlib_cli_output(vm, " remote id-type %U data %U",
|
||||
format_ikev2_id_type, p->rem_id.type,
|
||||
format_ip4_address, p->rem_id.data);
|
||||
format_ip_address, p->rem_id.data);
|
||||
else if (p->rem_id.type == IKEV2_ID_TYPE_ID_KEY_ID)
|
||||
vlib_cli_output(vm, " remote id-type %U data 0x%U",
|
||||
format_ikev2_id_type, p->rem_id.type,
|
||||
@@ -592,19 +586,19 @@ show_ikev2_profile_command_fn (vlib_main_t * vm,
|
||||
format_ikev2_id_type, p->rem_id.type, p->rem_id.data);
|
||||
}
|
||||
|
||||
if (p->loc_ts.end_addr.as_u32)
|
||||
if (!ip_address_is_zero (&p->loc_ts.start_addr))
|
||||
vlib_cli_output(vm, " local traffic-selector addr %U - %U port %u - %u"
|
||||
" protocol %u",
|
||||
format_ip4_address, &p->loc_ts.start_addr,
|
||||
format_ip4_address, &p->loc_ts.end_addr,
|
||||
format_ip_address, &p->loc_ts.start_addr,
|
||||
format_ip_address, &p->loc_ts.end_addr,
|
||||
p->loc_ts.start_port, p->loc_ts.end_port,
|
||||
p->loc_ts.protocol_id);
|
||||
|
||||
if (p->rem_ts.end_addr.as_u32)
|
||||
if (!ip_address_is_zero (&p->rem_ts.start_addr))
|
||||
vlib_cli_output(vm, " remote traffic-selector addr %U - %U port %u - %u"
|
||||
" protocol %u",
|
||||
format_ip4_address, &p->rem_ts.start_addr,
|
||||
format_ip4_address, &p->rem_ts.end_addr,
|
||||
format_ip_address, &p->rem_ts.start_addr,
|
||||
format_ip_address, &p->rem_ts.end_addr,
|
||||
p->rem_ts.start_port, p->rem_ts.end_port,
|
||||
p->rem_ts.protocol_id);
|
||||
if (~0 != p->tun_itf)
|
||||
@@ -613,7 +607,7 @@ show_ikev2_profile_command_fn (vlib_main_t * vm,
|
||||
if (~0 != p->responder.sw_if_index)
|
||||
vlib_cli_output(vm, " responder %U %U",
|
||||
format_vnet_sw_if_index_name, vnet_get_main(), p->responder.sw_if_index,
|
||||
format_ip4_address, &p->responder.ip4);
|
||||
format_ip_address, &p->responder.addr);
|
||||
if (p->udp_encap)
|
||||
vlib_cli_output(vm, " udp-encap");
|
||||
|
||||
|
||||
@@ -37,14 +37,23 @@ typedef CLIB_PACKED (struct {
|
||||
/* *INDENT-ON* */
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
typedef CLIB_PACKED (struct {
|
||||
ip4_address_t start_addr;
|
||||
ip4_address_t end_addr;
|
||||
}) ikev2_ip4_addr_pair_t;
|
||||
|
||||
typedef CLIB_PACKED (struct {
|
||||
ip6_address_t start_addr;
|
||||
ip6_address_t end_addr;
|
||||
}) ikev2_ip6_addr_pair_t;
|
||||
|
||||
typedef CLIB_PACKED (struct {
|
||||
u8 ts_type;
|
||||
u8 protocol_id;
|
||||
u16 selector_len;
|
||||
u16 start_port;
|
||||
u16 end_port;
|
||||
ip4_address_t start_addr;
|
||||
ip4_address_t end_addr;
|
||||
u8 addr_pair[0];
|
||||
}) ikev2_ts_payload_entry_t;
|
||||
/* *INDENT-OFF* */
|
||||
|
||||
@@ -286,12 +295,46 @@ ikev2_payload_add_auth (ikev2_payload_chain_t * c, ikev2_auth_t * auth)
|
||||
ikev2_payload_add_data (c, auth->data);
|
||||
}
|
||||
|
||||
static void
|
||||
ikev2_payload_add_ts_entry (u8 ** data, ikev2_ts_t * ts)
|
||||
{
|
||||
u8 * tmp;
|
||||
ikev2_ts_payload_entry_t *entry;
|
||||
int len = sizeof (*entry);
|
||||
|
||||
if (ts->ts_type == TS_IPV4_ADDR_RANGE)
|
||||
len += sizeof (ikev2_ip4_addr_pair_t);
|
||||
else
|
||||
len += sizeof (ikev2_ip6_addr_pair_t);
|
||||
|
||||
vec_add2 (data[0], tmp, len);
|
||||
entry = (ikev2_ts_payload_entry_t *) tmp;
|
||||
entry->ts_type = ts->ts_type;
|
||||
entry->protocol_id = ts->protocol_id;
|
||||
entry->selector_len = clib_host_to_net_u16 (len);
|
||||
entry->start_port = clib_host_to_net_u16 (ts->start_port);
|
||||
entry->end_port = clib_host_to_net_u16 (ts->end_port);
|
||||
|
||||
if (ts->ts_type == TS_IPV4_ADDR_RANGE)
|
||||
{
|
||||
ikev2_ip4_addr_pair_t *pair = (ikev2_ip4_addr_pair_t*) entry->addr_pair;
|
||||
ip_address_copy_addr (&pair->start_addr, &ts->start_addr);
|
||||
ip_address_copy_addr (&pair->end_addr, &ts->end_addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
ikev2_ip6_addr_pair_t *pair = (ikev2_ip6_addr_pair_t*) entry->addr_pair;
|
||||
ip_address_copy_addr (&pair->start_addr, &ts->start_addr);
|
||||
ip_address_copy_addr (&pair->end_addr, &ts->end_addr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ikev2_payload_add_ts (ikev2_payload_chain_t * c, ikev2_ts_t * ts, u8 type)
|
||||
{
|
||||
ike_ts_payload_header_t *tsh;
|
||||
ikev2_ts_t *ts2;
|
||||
u8 *data = 0, *tmp;
|
||||
u8 *data = 0;
|
||||
|
||||
tsh =
|
||||
(ike_ts_payload_header_t *) ikev2_payload_add_hdr (c, type,
|
||||
@@ -300,17 +343,9 @@ ikev2_payload_add_ts (ikev2_payload_chain_t * c, ikev2_ts_t * ts, u8 type)
|
||||
|
||||
vec_foreach (ts2, ts)
|
||||
{
|
||||
ASSERT (ts2->ts_type == 7); /*TS_IPV4_ADDR_RANGE */
|
||||
ikev2_ts_payload_entry_t *entry;
|
||||
vec_add2 (data, tmp, sizeof (*entry));
|
||||
entry = (ikev2_ts_payload_entry_t *) tmp;
|
||||
entry->ts_type = ts2->ts_type;
|
||||
entry->protocol_id = ts2->protocol_id;
|
||||
entry->selector_len = clib_host_to_net_u16 (16);
|
||||
entry->start_port = clib_host_to_net_u16 (ts2->start_port);
|
||||
entry->end_port = clib_host_to_net_u16 (ts2->end_port);
|
||||
entry->start_addr.as_u32 = ts2->start_addr.as_u32;
|
||||
entry->end_addr.as_u32 = ts2->end_addr.as_u32;
|
||||
ASSERT (ts2->ts_type == TS_IPV4_ADDR_RANGE ||
|
||||
ts2->ts_type == TS_IPV6_ADDR_RANGE);
|
||||
ikev2_payload_add_ts_entry (&data, ts2);
|
||||
}
|
||||
|
||||
ikev2_payload_add_data (c, data);
|
||||
@@ -413,31 +448,56 @@ ikev2_parse_ts_payload (ike_payload_header_t * ikep, u32 rlen)
|
||||
{
|
||||
ike_ts_payload_header_t *tsp = (ike_ts_payload_header_t *) ikep;
|
||||
ikev2_ts_t *r = 0, *ts;
|
||||
u8 i;
|
||||
ikev2_ip4_addr_pair_t *pair4;
|
||||
ikev2_ip6_addr_pair_t *pair6;
|
||||
int p = 0, n_left;
|
||||
ikev2_ts_payload_entry_t *pe;
|
||||
|
||||
if (sizeof (*tsp) > rlen)
|
||||
return 0;
|
||||
|
||||
if (sizeof (*tsp) + tsp->num_ts * sizeof (ikev2_ts_payload_entry_t) > rlen)
|
||||
return 0;
|
||||
rlen -= sizeof (*tsp);
|
||||
n_left = tsp->num_ts;
|
||||
|
||||
for (i = 0; i < tsp->num_ts; i++)
|
||||
while (n_left && p + sizeof (*pe) < rlen)
|
||||
{
|
||||
if (tsp->ts[i].ts_type != 7) /* TS_IPV4_ADDR_RANGE */
|
||||
pe = (ikev2_ts_payload_entry_t *) (((u8 *)tsp->ts) + p);
|
||||
p += sizeof (*pe);
|
||||
|
||||
if (pe->ts_type != TS_IPV4_ADDR_RANGE &&
|
||||
pe->ts_type != TS_IPV6_ADDR_RANGE)
|
||||
{
|
||||
ikev2_elog_uint (IKEV2_LOG_ERROR,
|
||||
"unsupported TS type received (%u)", tsp->ts[i].ts_type);
|
||||
continue;
|
||||
"unsupported TS type received (%u)", pe->ts_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
vec_add2 (r, ts, 1);
|
||||
ts->ts_type = tsp->ts[i].ts_type;
|
||||
ts->protocol_id = tsp->ts[i].protocol_id;
|
||||
ts->start_port = tsp->ts[i].start_port;
|
||||
ts->end_port = tsp->ts[i].end_port;
|
||||
ts->start_addr.as_u32 = tsp->ts[i].start_addr.as_u32;
|
||||
ts->end_addr.as_u32 = tsp->ts[i].end_addr.as_u32;
|
||||
ts->ts_type = pe->ts_type;
|
||||
ts->protocol_id = pe->protocol_id;
|
||||
ts->start_port = pe->start_port;
|
||||
ts->end_port = pe->end_port;
|
||||
|
||||
if (pe->ts_type == TS_IPV4_ADDR_RANGE)
|
||||
{
|
||||
pair4 = (ikev2_ip4_addr_pair_t*) pe->addr_pair;
|
||||
ip_address_set (&ts->start_addr, &pair4->start_addr, AF_IP4);
|
||||
ip_address_set (&ts->end_addr, &pair4->end_addr, AF_IP4);
|
||||
p += sizeof (*pair4);
|
||||
}
|
||||
else
|
||||
{
|
||||
pair6 = (ikev2_ip6_addr_pair_t*) pe->addr_pair;
|
||||
ip_address_set (&ts->start_addr, &pair6->start_addr, AF_IP6);
|
||||
ip_address_set (&ts->end_addr, &pair6->end_addr, AF_IP6);
|
||||
p += sizeof (*pair6);
|
||||
}
|
||||
n_left--;
|
||||
}
|
||||
|
||||
if (n_left)
|
||||
return 0;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ do { \
|
||||
} \
|
||||
} while (0) \
|
||||
|
||||
#define ikev2_elog_exchange(_format, _ispi, _rspi, _addr) \
|
||||
#define ikev2_elog_exchange_internal(_format, _ispi, _rspi, _addr) \
|
||||
do { \
|
||||
ikev2_main_t *km = &ikev2_main; \
|
||||
if (PREDICT_FALSE (km->log_level >= IKEV2_LOG_DEBUG)) \
|
||||
@@ -110,6 +110,17 @@ do { \
|
||||
} \
|
||||
} while (0) \
|
||||
|
||||
#define IKE_ELOG_IP4_FMT "%d.%d.%d.%d"
|
||||
#define IKE_ELOG_IP6_FMT "[v6]:%x%x:%x%x"
|
||||
|
||||
#define ikev2_elog_exchange(_fmt, _ispi, _rspi, _addr, _v4) \
|
||||
do { \
|
||||
if (_v4) \
|
||||
ikev2_elog_exchange_internal (_fmt IKE_ELOG_IP4_FMT, _ispi, _rspi, _addr);\
|
||||
else \
|
||||
ikev2_elog_exchange_internal (_fmt IKE_ELOG_IP6_FMT, _ispi, _rspi, _addr);\
|
||||
} while (0)
|
||||
|
||||
#define ikev2_elog_uint(_level, _format, _val) \
|
||||
do { \
|
||||
ikev2_main_t *km = &ikev2_main; \
|
||||
@@ -156,31 +167,6 @@ do { \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define ikev2_elog_peers(_level, _format, _ip1, _ip2) \
|
||||
do { \
|
||||
ikev2_main_t *km = &ikev2_main; \
|
||||
if (PREDICT_FALSE (km->log_level >= _level)) \
|
||||
{ \
|
||||
ELOG_TYPE_DECLARE (e) = \
|
||||
{ \
|
||||
.format = "ikev2: " _format, \
|
||||
.format_args = "i1i1i1i1i1i1i1i1", \
|
||||
}; \
|
||||
CLIB_PACKED(struct { \
|
||||
u8 i11; u8 i12; u8 i13; u8 i14; \
|
||||
u8 i21; u8 i22; u8 i23; u8 i24; }) *ed; \
|
||||
ed = ELOG_DATA (&vlib_global_main.elog_main, e); \
|
||||
ed->i14 = (_ip1) >> 24; \
|
||||
ed->i13 = (_ip1) >> 16; \
|
||||
ed->i12 = (_ip1) >> 8; \
|
||||
ed->i11 = (_ip1); \
|
||||
ed->i24 = (_ip2) >> 24; \
|
||||
ed->i23 = (_ip2) >> 16; \
|
||||
ed->i22 = (_ip2) >> 8; \
|
||||
ed->i21 = (_ip2); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define ikev2_elog_error(_msg) \
|
||||
_ikev2_elog(IKEV2_LOG_ERROR, "[error] " _msg)
|
||||
#define ikev2_elog_warning(_msg) \
|
||||
@@ -258,19 +244,19 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 ts_type;
|
||||
ikev2_traffic_selector_type_t ts_type;
|
||||
u8 protocol_id;
|
||||
u16 selector_len;
|
||||
u16 start_port;
|
||||
u16 end_port;
|
||||
ip4_address_t start_addr;
|
||||
ip4_address_t end_addr;
|
||||
ip_address_t start_addr;
|
||||
ip_address_t end_addr;
|
||||
} ikev2_ts_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 sw_if_index;
|
||||
ip4_address_t ip4;
|
||||
ip_address_t addr;
|
||||
} ikev2_responder_t;
|
||||
|
||||
typedef struct
|
||||
@@ -368,8 +354,8 @@ typedef struct
|
||||
ikev2_state_t state;
|
||||
u8 unsupported_cp;
|
||||
u8 initial_contact;
|
||||
ip4_address_t iaddr;
|
||||
ip4_address_t raddr;
|
||||
ip_address_t iaddr;
|
||||
ip_address_t raddr;
|
||||
u64 ispi;
|
||||
u64 rspi;
|
||||
u8 *i_nonce;
|
||||
|
||||
@@ -135,7 +135,7 @@ MACRO_FORMAT (auth_method)
|
||||
s = format (s, " %s", id->data);
|
||||
break;
|
||||
case IKEV2_ID_TYPE_ID_IPV4_ADDR:
|
||||
s = format (s, " %U", format_ip4_address, id->data);
|
||||
s = format (s, " %U", format_ip_address, id->data);
|
||||
break;
|
||||
case IKEV2_ID_TYPE_ID_KEY_ID:
|
||||
s = format (s, " 0x%U", format_hex_bytes, id->data, id->data_len);
|
||||
@@ -225,7 +225,6 @@ static void vl_api_ikev2_profile_details_t_handler
|
||||
{
|
||||
vat_main_t *vam = ikev2_test_main.vat_main;
|
||||
vl_api_ikev2_profile_t *p = &mp->profile;
|
||||
ip4_address_t start_addr, end_addr;
|
||||
|
||||
fformat (vam->ofp, "profile %s\n", p->name);
|
||||
|
||||
@@ -256,21 +255,17 @@ static void vl_api_ikev2_profile_details_t_handler
|
||||
format_ikev2_id_type_and_data, &p->rem_id);
|
||||
}
|
||||
|
||||
ip4_address_decode (p->loc_ts.start_addr, &start_addr);
|
||||
ip4_address_decode (p->loc_ts.end_addr, &end_addr);
|
||||
fformat (vam->ofp, " local traffic-selector addr %U - %U port %u - %u"
|
||||
" protocol %u\n",
|
||||
format_ip4_address, &start_addr,
|
||||
format_ip4_address, &end_addr,
|
||||
format_ip_address, &p->loc_ts.start_addr,
|
||||
format_ip_address, &p->loc_ts.end_addr,
|
||||
clib_net_to_host_u16 (p->loc_ts.start_port),
|
||||
clib_net_to_host_u16 (p->loc_ts.end_port), p->loc_ts.protocol_id);
|
||||
|
||||
ip4_address_decode (p->rem_ts.start_addr, &start_addr);
|
||||
ip4_address_decode (p->rem_ts.end_addr, &end_addr);
|
||||
fformat (vam->ofp, " remote traffic-selector addr %U - %U port %u - %u"
|
||||
" protocol %u\n",
|
||||
format_ip4_address, &start_addr,
|
||||
format_ip4_address, &end_addr,
|
||||
format_ip_address, &p->rem_ts.start_addr,
|
||||
format_ip_address, &p->rem_ts.end_addr,
|
||||
clib_net_to_host_u16 (p->rem_ts.start_port),
|
||||
clib_net_to_host_u16 (p->rem_ts.end_port), p->rem_ts.protocol_id);
|
||||
u32 tun_itf = clib_net_to_host_u32 (p->tun_itf);
|
||||
@@ -280,7 +275,7 @@ static void vl_api_ikev2_profile_details_t_handler
|
||||
u32 sw_if_index = clib_net_to_host_u32 (p->responder.sw_if_index);
|
||||
if (~0 != sw_if_index)
|
||||
fformat (vam->ofp, " responder idx %d %U\n",
|
||||
sw_if_index, format_ip4_address, &p->responder.ip4);
|
||||
sw_if_index, format_ip_address, &p->responder.addr);
|
||||
|
||||
if (p->udp_encap)
|
||||
fformat (vam->ofp, " udp-encap\n");
|
||||
@@ -348,18 +343,18 @@ vl_api_ikev2_sa_details_t_handler (vl_api_ikev2_sa_details_t * mp)
|
||||
{
|
||||
vat_main_t *vam = ikev2_test_main.vat_main;
|
||||
vl_api_ikev2_sa_t *sa = &mp->sa;
|
||||
ip4_address_t iaddr;
|
||||
ip4_address_t raddr;
|
||||
ip_address_t iaddr;
|
||||
ip_address_t raddr;
|
||||
vl_api_ikev2_keys_t *k = &sa->keys;
|
||||
vl_api_ikev2_sa_t_endian (sa);
|
||||
|
||||
ip4_address_decode (sa->iaddr, &iaddr);
|
||||
ip4_address_decode (sa->raddr, &raddr);
|
||||
ip_address_decode2 (&sa->iaddr, &iaddr);
|
||||
ip_address_decode2 (&sa->raddr, &raddr);
|
||||
|
||||
fformat (vam->ofp, "profile index %d sa index: %d\n",
|
||||
mp->sa.profile_index, mp->sa.sa_index);
|
||||
fformat (vam->ofp, " iip %U ispi %lx rip %U rspi %lx\n", format_ip4_address,
|
||||
&iaddr, sa->ispi, format_ip4_address, &raddr, sa->rspi);
|
||||
fformat (vam->ofp, " iip %U ispi %lx rip %U rspi %lx\n", format_ip_address,
|
||||
&iaddr, sa->ispi, format_ip_address, &raddr, sa->rspi);
|
||||
fformat (vam->ofp, " %U ", format_ikev2_sa_transform, &sa->encryption);
|
||||
fformat (vam->ofp, "%U ", format_ikev2_sa_transform, &sa->prf);
|
||||
fformat (vam->ofp, "%U ", format_ikev2_sa_transform, &sa->integrity);
|
||||
@@ -526,18 +521,17 @@ static void
|
||||
{
|
||||
vat_main_t *vam = ikev2_test_main.vat_main;
|
||||
vl_api_ikev2_ts_t *ts = &mp->ts;
|
||||
ip4_address_t start_addr;
|
||||
ip4_address_t end_addr;
|
||||
ip_address_t start_addr, end_addr;
|
||||
vl_api_ikev2_ts_t_endian (ts);
|
||||
|
||||
ip4_address_decode (ts->start_addr, &start_addr);
|
||||
ip4_address_decode (ts->end_addr, &end_addr);
|
||||
ip_address_decode2 (&ts->start_addr, &start_addr);
|
||||
ip_address_decode2 (&ts->end_addr, &end_addr);
|
||||
|
||||
fformat (vam->ofp, " %s protocol_id %u addr "
|
||||
"%U - %U port %u - %u\n",
|
||||
ts->is_local, ts->protocol_id,
|
||||
format_ip4_address, &start_addr,
|
||||
format_ip4_address, &end_addr, ts->start_port, ts->end_port);
|
||||
format_ip_address, &start_addr,
|
||||
format_ip_address, &end_addr, ts->start_port, ts->end_port);
|
||||
vam->result_ready = 1;
|
||||
}
|
||||
|
||||
@@ -797,7 +791,7 @@ api_ikev2_profile_set_id (vat_main_t * vam)
|
||||
u8 *data = 0;
|
||||
u8 is_local = 0;
|
||||
u32 id_type = 0;
|
||||
ip4_address_t ip4;
|
||||
ip_address_t ip;
|
||||
int ret;
|
||||
|
||||
const char *valid_chars = "a-zA-Z0-9_";
|
||||
@@ -808,10 +802,10 @@ api_ikev2_profile_set_id (vat_main_t * vam)
|
||||
vec_add1 (name, 0);
|
||||
else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
|
||||
;
|
||||
else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
|
||||
else if (unformat (i, "id_data %U", unformat_ip_address, &ip))
|
||||
{
|
||||
data = vec_new (u8, 4);
|
||||
clib_memcpy (data, ip4.as_u8, 4);
|
||||
data = vec_new (u8, ip_address_size (&ip));
|
||||
clib_memcpy (data, ip_addr_bytes (&ip), ip_address_size (&ip));
|
||||
}
|
||||
else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
|
||||
;
|
||||
@@ -875,14 +869,12 @@ api_ikev2_profile_set_ts (vat_main_t * vam)
|
||||
u8 *name = 0;
|
||||
u8 is_local = 0;
|
||||
u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
|
||||
ip4_address_t start_addr, end_addr;
|
||||
ip_address_t start_addr, end_addr;
|
||||
u8 start_addr_set = 0, end_addr_set = 0;
|
||||
|
||||
const char *valid_chars = "a-zA-Z0-9_";
|
||||
int ret;
|
||||
|
||||
start_addr.as_u32 = 0;
|
||||
end_addr.as_u32 = (u32) ~ 0;
|
||||
|
||||
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (i, "name %U", unformat_token, valid_chars, &name))
|
||||
@@ -894,10 +886,10 @@ api_ikev2_profile_set_ts (vat_main_t * vam)
|
||||
else if (unformat (i, "end_port %d", &end_port))
|
||||
;
|
||||
else
|
||||
if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
|
||||
;
|
||||
else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
|
||||
;
|
||||
if (unformat (i, "start_addr %U", unformat_ip_address, &start_addr))
|
||||
start_addr_set = 1;
|
||||
else if (unformat (i, "end_addr %U", unformat_ip_address, &end_addr))
|
||||
end_addr_set = 1;
|
||||
else if (unformat (i, "local"))
|
||||
is_local = 1;
|
||||
else if (unformat (i, "remote"))
|
||||
@@ -909,6 +901,12 @@ api_ikev2_profile_set_ts (vat_main_t * vam)
|
||||
}
|
||||
}
|
||||
|
||||
if (!start_addr_set || !end_addr_set)
|
||||
{
|
||||
errmsg ("missing start or end address");
|
||||
return -99;
|
||||
}
|
||||
|
||||
if (!vec_len (name))
|
||||
{
|
||||
errmsg ("profile name must be specified");
|
||||
@@ -927,8 +925,8 @@ api_ikev2_profile_set_ts (vat_main_t * vam)
|
||||
mp->ts.protocol_id = (u8) proto;
|
||||
mp->ts.start_port = clib_host_to_net_u16 ((u16) start_port);
|
||||
mp->ts.end_port = clib_host_to_net_u16 ((u16) end_port);
|
||||
ip4_address_encode (&start_addr, mp->ts.start_addr);
|
||||
ip4_address_encode (&end_addr, mp->ts.end_addr);
|
||||
ip_address_encode2 (&start_addr, &mp->ts.start_addr);
|
||||
ip_address_encode2 (&end_addr, &mp->ts.end_addr);
|
||||
clib_memcpy (mp->name, name, vec_len (name));
|
||||
vec_free (name);
|
||||
|
||||
@@ -1035,7 +1033,7 @@ api_ikev2_set_responder (vat_main_t * vam)
|
||||
int ret;
|
||||
u8 *name = 0;
|
||||
u32 sw_if_index = ~0;
|
||||
ip4_address_t address;
|
||||
ip_address_t address;
|
||||
|
||||
const char *valid_chars = "a-zA-Z0-9_";
|
||||
|
||||
@@ -1043,7 +1041,7 @@ api_ikev2_set_responder (vat_main_t * vam)
|
||||
{
|
||||
if (unformat
|
||||
(i, "%U interface %d address %U", unformat_token, valid_chars,
|
||||
&name, &sw_if_index, unformat_ip4_address, &address))
|
||||
&name, &sw_if_index, unformat_ip_address, &address))
|
||||
vec_add1 (name, 0);
|
||||
else
|
||||
{
|
||||
@@ -1070,7 +1068,7 @@ api_ikev2_set_responder (vat_main_t * vam)
|
||||
vec_free (name);
|
||||
|
||||
mp->responder.sw_if_index = clib_host_to_net_u32 (sw_if_index);
|
||||
ip4_address_encode (&address, mp->responder.ip4);
|
||||
ip_address_encode2 (&address, &mp->responder.addr);
|
||||
|
||||
S (mp);
|
||||
W (ret);
|
||||
|
||||
@@ -34,8 +34,8 @@ typedef ikev2_ts
|
||||
u8 protocol_id;
|
||||
u16 start_port;
|
||||
u16 end_port;
|
||||
vl_api_ip4_address_t start_addr;
|
||||
vl_api_ip4_address_t end_addr;
|
||||
vl_api_address_t start_addr;
|
||||
vl_api_address_t end_addr;
|
||||
};
|
||||
|
||||
typedef ikev2_auth
|
||||
@@ -49,7 +49,7 @@ typedef ikev2_auth
|
||||
typedef ikev2_responder
|
||||
{
|
||||
vl_api_interface_index_t sw_if_index;
|
||||
vl_api_ip4_address_t ip4;
|
||||
vl_api_address_t addr;
|
||||
};
|
||||
|
||||
typedef ikev2_ike_transforms
|
||||
@@ -134,8 +134,8 @@ typedef ikev2_sa
|
||||
|
||||
u64 ispi;
|
||||
u64 rspi;
|
||||
vl_api_ip4_address_t iaddr;
|
||||
vl_api_ip4_address_t raddr;
|
||||
vl_api_address_t iaddr;
|
||||
vl_api_address_t raddr;
|
||||
|
||||
vl_api_ikev2_keys_t keys;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,4 @@
|
||||
from ipaddress import IPv4Address, AddressValueError
|
||||
from vpp_object import VppObject
|
||||
from vpp_papi import VppEnum
|
||||
|
||||
@@ -12,7 +13,8 @@ class AuthMethod:
|
||||
|
||||
class IDType:
|
||||
v = {'ip4-addr': 1,
|
||||
'fqdn': 2}
|
||||
'fqdn': 2,
|
||||
'ip6-addr': 5}
|
||||
|
||||
@staticmethod
|
||||
def value(key): return IDType.v[key]
|
||||
@@ -52,7 +54,8 @@ class Profile(VppObject):
|
||||
'is_local': False}
|
||||
|
||||
def add_local_ts(self, start_addr, end_addr, start_port=0, end_port=0xffff,
|
||||
proto=0):
|
||||
proto=0, is_ip4=True):
|
||||
self.ts_is_ip4 = is_ip4
|
||||
self.local_ts = {'is_local': True,
|
||||
'protocol_id': proto,
|
||||
'start_port': start_port,
|
||||
@@ -62,6 +65,12 @@ class Profile(VppObject):
|
||||
|
||||
def add_remote_ts(self, start_addr, end_addr, start_port=0,
|
||||
end_port=0xffff, proto=0):
|
||||
try:
|
||||
IPv4Address(start_addr)
|
||||
is_ip4 = True
|
||||
except AddressValueError:
|
||||
is_ip4 = False
|
||||
self.ts_is_ip4 = is_ip4
|
||||
self.remote_ts = {'is_local': False,
|
||||
'protocol_id': proto,
|
||||
'start_port': start_port,
|
||||
|
||||
Reference in New Issue
Block a user