aboutsummaryrefslogtreecommitdiffstats
path: root/src/vat
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2017-12-01 13:34:24 +0100
committerDamjan Marion <dmarion.lists@gmail.com>2017-12-02 10:11:25 +0000
commit91c6ef7cae2d20ca17a69003a44090614412c63f (patch)
tree28a0ae8030e840a0bc8f65e28f9d5bc2868bf39d /src/vat
parent9fa1581cc40b656b6e00d77479fc2424cd50a126 (diff)
tap_v2: multiple improvements
- add support for assigning tap interface to the bridge - add support for assigning tap interface host side ip4 and ip6 address - host namespace can be specified as PID (pid:12345) or full path to file - automatically bring linux interface up Change-Id: I1cf7c3cad9a740e430cc1b9c2bb0aad0ba4cc8d8 Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vat')
-rw-r--r--src/vat/api_format.c61
1 files changed, 49 insertions, 12 deletions
diff --git a/src/vat/api_format.c b/src/vat/api_format.c
index c9c62c76e2c..d39a61a813a 100644
--- a/src/vat/api_format.c
+++ b/src/vat/api_format.c
@@ -7810,10 +7810,13 @@ api_tap_create_v2 (vat_main_t * vam)
vl_api_tap_create_v2_t *mp;
u8 mac_address[6];
u8 random_mac = 1;
- u8 name_set = 0;
- u8 *tap_name;
- u8 *net_ns = 0;
- u8 net_ns_set = 0;
+ u8 *tap_name = 0;
+ u8 *host_namespace = 0;
+ u8 *host_bridge = 0;
+ ip4_address_t host_ip4_addr;
+ u32 host_ip4_prefix_len = 0;
+ ip6_address_t host_ip6_addr;
+ u32 host_ip6_prefix_len = 0;
int ret;
int rx_ring_sz = 0, tx_ring_sz = 0;
@@ -7827,9 +7830,17 @@ api_tap_create_v2 (vat_main_t * vam)
random_mac = 0;
}
else if (unformat (i, "name %s", &tap_name))
- name_set = 1;
- else if (unformat (i, "host-ns %s", &net_ns))
- net_ns_set = 1;
+ ;
+ else if (unformat (i, "host-ns %s", &host_namespace))
+ ;
+ else if (unformat (i, "host-bridge %s", &host_bridge))
+ ;
+ else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
+ &host_ip4_addr, &host_ip4_prefix_len))
+ ;
+ else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
+ &host_ip6_addr, &host_ip6_prefix_len))
+ ;
else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
;
else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
@@ -7838,7 +7849,7 @@ api_tap_create_v2 (vat_main_t * vam)
break;
}
- if (name_set == 0)
+ if (tap_name == 0)
{
errmsg ("missing tap name. ");
return -99;
@@ -7848,11 +7859,26 @@ api_tap_create_v2 (vat_main_t * vam)
errmsg ("tap name too long. ");
return -99;
}
- if (vec_len (net_ns) > 63)
+ if (vec_len (host_namespace) > 63)
{
errmsg ("host name space too long. ");
return -99;
}
+ if (vec_len (host_bridge) > 63)
+ {
+ errmsg ("host bridge name too long. ");
+ return -99;
+ }
+ if (host_ip4_prefix_len > 32)
+ {
+ errmsg ("host ip4 prefix length not valid. ");
+ return -99;
+ }
+ if (host_ip6_prefix_len > 128)
+ {
+ errmsg ("host ip6 prefix length not valid. ");
+ return -99;
+ }
if (!is_pow2 (rx_ring_sz))
{
errmsg ("rx ring size must be power of 2. ");
@@ -7882,11 +7908,22 @@ api_tap_create_v2 (vat_main_t * vam)
mp->use_random_mac = random_mac;
clib_memcpy (mp->mac_address, mac_address, 6);
clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
- mp->net_ns_set = net_ns_set;
+ mp->host_namespace_set = host_namespace != 0;
+ mp->host_bridge_set = host_bridge != 0;
+ mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
+ mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
mp->rx_ring_sz = rx_ring_sz;
mp->tx_ring_sz = tx_ring_sz;
- if (net_ns)
- clib_memcpy (mp->net_ns, net_ns, vec_len (net_ns));
+ if (host_namespace)
+ clib_memcpy (mp->host_namespace, host_namespace,
+ vec_len (host_namespace));
+ if (host_bridge)
+ clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
+ if (host_ip4_prefix_len)
+ clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
+ if (host_ip4_prefix_len)
+ clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
+
vec_free (tap_name);