GBP: add allowed ethertypes to contracts
[vpp.git] / src / plugins / gbp / gbp_api.c
index 567c7d8..8ea5a0e 100644 (file)
@@ -154,7 +154,7 @@ vl_api_gbp_endpoint_add_t_handler (vl_api_gbp_endpoint_add_t * mp)
        ip_address_decode (&mp->endpoint.ips[ii], &ips[ii]);
       }
     }
-  mac_address_decode ((const u8 *) &mp->endpoint.mac, &mac);
+  mac_address_decode (mp->endpoint.mac, &mac);
 
   if (GBP_ENDPOINT_FLAG_REMOTE & gef)
     {
@@ -260,7 +260,7 @@ gbp_endpoint_send_details (index_t gei, void *args)
   mp->endpoint.flags = gbp_endpoint_flags_encode (gef->gef_flags);
   mp->handle = htonl (gei);
   mp->age = vlib_time_now (vlib_get_main ()) - ge->ge_last_time;
-  mac_address_encode (&ge->ge_key.gek_mac, (u8 *) & mp->endpoint.mac);
+  mac_address_encode (&ge->ge_key.gek_mac, mp->endpoint.mac);
 
   vec_foreach_index (ii, ge->ge_key.gek_ips)
   {
@@ -821,7 +821,7 @@ gbp_next_hop_decode (const vl_api_gbp_next_hop_t * in, index_t * gnhi)
     return (VNET_API_ERROR_NO_SUCH_FIB);
 
   ip_address_decode (&in->ip, &ip);
-  mac_address_decode ((const u8 *) &in->mac, &mac);
+  mac_address_decode (in->mac, &mac);
 
   *gnhi = gbp_next_hop_alloc (&ip, grd, &mac, gbd);
 
@@ -924,8 +924,11 @@ static void
 vl_api_gbp_contract_add_del_t_handler (vl_api_gbp_contract_add_del_t * mp)
 {
   vl_api_gbp_contract_add_del_reply_t *rmp;
+  u16 *allowed_ethertypes;
   index_t *rules;
-  int rv = 0;
+  int ii, rv = 0;
+  u8 *data, n_et;
+  u16 *et;
 
   if (mp->is_add)
     {
@@ -934,9 +937,28 @@ vl_api_gbp_contract_add_del_t_handler (vl_api_gbp_contract_add_del_t * mp)
       if (0 != rv)
        goto out;
 
+      allowed_ethertypes = NULL;
+
+      /*
+       * move past the variable legnth array of rules to get to the
+       * allowed ether types
+       */
+      data = (((u8 *) & mp->contract.n_ether_types) +
+             (sizeof (mp->contract.rules[0]) * mp->contract.n_rules));
+      n_et = *data;
+      et = (u16 *) (++data);
+      vec_validate (allowed_ethertypes, n_et - 1);
+
+      for (ii = 0; ii < n_et; ii++)
+       {
+         /* leave the ether types in network order */
+         allowed_ethertypes[ii] = et[ii];
+       }
+
       rv = gbp_contract_update (ntohs (mp->contract.src_epg),
                                ntohs (mp->contract.dst_epg),
-                               ntohl (mp->contract.acl_index), rules);
+                               ntohl (mp->contract.acl_index),
+                               rules, allowed_ethertypes);
     }
   else
     rv = gbp_contract_delete (ntohs (mp->contract.src_epg),