+static u8 *
+format_ikev2_traffic_selector (u8 * s, va_list * va)
+{
+ ikev2_ts_t *ts = va_arg (*va, ikev2_ts_t *);
+ u32 index = va_arg (*va, u32);
+
+ s = format (s, "%u type %u protocol_id %u addr "
+ "%U - %U port %u - %u\n",
+ index, ts->ts_type, ts->protocol_id,
+ 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;
+}
+
+static u8 *
+format_ikev2_child_sa (u8 * s, va_list * va)
+{
+ ikev2_child_sa_t *child = va_arg (*va, ikev2_child_sa_t *);
+ u32 index = va_arg (*va, u32);
+ ikev2_ts_t *ts;
+ ikev2_sa_transform_t *tr;
+ u8 *c = 0;
+
+ u32 indent = format_get_indent (s);
+ indent += 1;
+
+ s = format (s, "child sa %u:", index);
+
+ tr = ikev2_sa_get_td_for_type (child->r_proposals,
+ IKEV2_TRANSFORM_TYPE_ENCR);
+ c = format (c, "%U ", format_ikev2_sa_transform, tr);
+
+ tr = ikev2_sa_get_td_for_type (child->r_proposals,
+ IKEV2_TRANSFORM_TYPE_INTEG);
+ c = format (c, "%U ", format_ikev2_sa_transform, tr);
+
+ tr = ikev2_sa_get_td_for_type (child->r_proposals,
+ IKEV2_TRANSFORM_TYPE_ESN);
+ c = format (c, "%U ", format_ikev2_sa_transform, tr);
+
+ s = format (s, "%v\n", c);
+ vec_free (c);
+
+ s = format (s, "%Uspi(i) %lx spi(r) %lx\n", format_white_space, indent,
+ child->i_proposals ? child->i_proposals[0].spi : 0,
+ child->r_proposals ? child->r_proposals[0].spi : 0);
+
+ s = format (s, "%USK_e i:%U\n%Ur:%U\n",
+ format_white_space, indent,
+ format_hex_bytes, child->sk_ei, vec_len (child->sk_ei),
+ format_white_space, indent + 6,
+ format_hex_bytes, child->sk_er, vec_len (child->sk_er));
+ if (child->sk_ai)
+ {
+ s = format (s, "%USK_a i:%U\n%Ur:%U\n",
+ format_white_space, indent,
+ format_hex_bytes, child->sk_ai, vec_len (child->sk_ai),
+ format_white_space, indent + 6,
+ format_hex_bytes, child->sk_ar, vec_len (child->sk_ar));
+ }
+ s = format (s, "%Utraffic selectors (i):", format_white_space, indent);
+ vec_foreach (ts, child->tsi)
+ s = format (s, "%U", format_ikev2_traffic_selector, ts, ts - child->tsi);
+ s = format (s, "%Utraffic selectors (r):", format_white_space, indent);
+ vec_foreach (ts, child->tsr)
+ s = format (s, "%U", format_ikev2_traffic_selector, ts, ts - child->tsr);
+ return s;
+}
+
+static u8 *
+format_ikev2_sa (u8 * s, va_list * va)
+{
+ ikev2_sa_t *sa = va_arg (*va, ikev2_sa_t *);
+ int details = va_arg (*va, int);
+ ikev2_sa_transform_t *tr;
+ ikev2_child_sa_t *child;
+ u32 indent = 1;
+
+ s = format (s, "iip %U ispi %lx rip %U rspi %lx",
+ format_ip_address, &sa->iaddr, sa->ispi,
+ format_ip_address, &sa->raddr, sa->rspi);
+ if (!details)
+ return s;
+
+ s = format (s, "\n%U", format_white_space, indent);
+
+ tr = ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
+ s = format (s, "%U ", format_ikev2_sa_transform, tr);
+
+ tr = ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
+ s = format (s, "%U ", format_ikev2_sa_transform, tr);
+
+ tr = ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
+ s = format (s, "%U ", format_ikev2_sa_transform, tr);
+
+ tr = ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_DH);
+ s = format (s, "%U", format_ikev2_sa_transform, tr);
+
+ s = format (s, "\n%U", format_white_space, indent);
+
+ s = format (s, "nonce i:%U\n%Ur:%U\n",
+ format_hex_bytes, sa->i_nonce, vec_len (sa->i_nonce),
+ format_white_space, indent + 6,
+ format_hex_bytes, sa->r_nonce, vec_len (sa->r_nonce));
+
+ s = format (s, "%USK_d %U\n", format_white_space, indent,
+ format_hex_bytes, sa->sk_d, vec_len (sa->sk_d));
+ if (sa->sk_ai)
+ {
+ s = format (s, "%USK_a i:%U\n%Ur:%U\n",
+ format_white_space, indent,
+ format_hex_bytes, sa->sk_ai, vec_len (sa->sk_ai),
+ format_white_space, indent + 6,
+ format_hex_bytes, sa->sk_ar, vec_len (sa->sk_ar));
+ }
+ s = format (s, "%USK_e i:%U\n%Ur:%U\n",
+ format_white_space, indent,
+ format_hex_bytes, sa->sk_ei, vec_len (sa->sk_ei),
+ format_white_space, indent + 6,
+ format_hex_bytes, sa->sk_er, vec_len (sa->sk_er));
+ s = format (s, "%USK_p i:%U\n%Ur:%U\n",
+ format_white_space, indent,
+ format_hex_bytes, sa->sk_pi, vec_len (sa->sk_pi),
+ format_white_space, indent + 6,
+ format_hex_bytes, sa->sk_pr, vec_len (sa->sk_pr));
+
+ s = format (s, "%Uidentifier (i) %U\n",
+ format_white_space, indent,
+ format_ikev2_id_type_and_data, &sa->i_id);
+ s = format (s, "%Uidentifier (r) %U\n",
+ format_white_space, indent,
+ format_ikev2_id_type_and_data, &sa->r_id);
+
+ vec_foreach (child, sa->childs)
+ {
+ s = format (s, "%U%U", format_white_space, indent + 2,
+ format_ikev2_child_sa, child, child - sa->childs);
+ }
+
+ return s;
+}