+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);
+ }
+
+ s = format (s, "Stats:\n");
+ s = format (s, " keepalives :%u\n", sa->stats.n_keepalives);
+ s = format (s, " rekey :%u\n", sa->stats.n_rekey_req);
+ s = format (s, " SA init :%u (retransmit: %u)\n", sa->stats.n_sa_init_req,
+ sa->stats.n_init_retransmit);
+ s = format (s, " retransmit: %u\n", sa->stats.n_retransmit);
+ s = format (s, " SA auth :%u\n", sa->stats.n_sa_auth_req);
+
+ return s;
+}