ipsec: infra for selecting backends
[vpp.git] / src / vnet / ipsec / ikev2_payload.c
index dd14812..3aae6d3 100644 (file)
@@ -111,7 +111,7 @@ ikev2_payload_add_hdr (ikev2_payload_chain_t * c, u8 payload_type, int len)
   c->last_hdr_off = vec_len (c->data);
   vec_add2 (c->data, tmp, len);
   hdr = (ike_payload_header_t *) tmp;
-  memset (hdr, 0, len);
+  clib_memset (hdr, 0, len);
 
   hdr->length = clib_host_to_net_u16 (len);
 
@@ -132,14 +132,29 @@ ikev2_payload_add_data (ikev2_payload_chain_t * c, u8 * data)
 
 void
 ikev2_payload_add_notify (ikev2_payload_chain_t * c, u16 msg_type, u8 * data)
+{
+  ikev2_payload_add_notify_2(c, msg_type, data, 0);
+}
+
+void
+ikev2_payload_add_notify_2 (ikev2_payload_chain_t * c, u16 msg_type,
+                               u8 * data, ikev2_notify_t * notify)
 {
   ike_notify_payload_header_t *n;
 
   n =
     (ike_notify_payload_header_t *) ikev2_payload_add_hdr (c,
-                                                          IKEV2_PAYLOAD_NOTIFY,
-                                                          sizeof (*n));
+                                                           IKEV2_PAYLOAD_NOTIFY,
+                                                           sizeof (*n));
   n->msg_type = clib_host_to_net_u16 (msg_type);
+  if (notify)
+    {
+      n->protocol_id = notify->protocol_id;
+      if (notify->spi)
+        {
+          n->spi_size = 4;
+        }
+    }
   ikev2_payload_add_data (c, data);
 }
 
@@ -190,7 +205,7 @@ ikev2_payload_add_sa (ikev2_payload_chain_t * c,
        clib_host_to_net_u16 (sizeof (*tr) + vec_len (t->attrs));
 
       if (vec_len (t->attrs) > 0)
-       clib_memcpy (tr->attributes, t->attrs, vec_len (t->attrs));
+       clib_memcpy_fast (tr->attributes, t->attrs, vec_len (t->attrs));
 
       DBG_PLD
        ("transform type %U transform_id %u last_or_more %u attr_size %u%s%U",