Add incrementing MAC / count support for the l2fib_add_del API
Change-Id: I1df1cd3d2630baab979e840153f1f109d3ead0c2 Signed-off-by: Dave Barach <openvpp@barachs.net>
This commit is contained in:

committed by
Damjan Marion

parent
3190f7ea3a
commit
41da02d96b
@ -526,6 +526,15 @@ void increment_v6_address (ip6_address_t * a)
|
|||||||
a->as_u64[1] = clib_net_to_host_u64 (v1);
|
a->as_u64[1] = clib_net_to_host_u64 (v1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void increment_mac_address (u64 *mac)
|
||||||
|
{
|
||||||
|
u64 tmp = *mac;
|
||||||
|
|
||||||
|
tmp = clib_net_to_host_u64(tmp);
|
||||||
|
tmp += 1<<16; /* skip unused (least significant) octets */
|
||||||
|
tmp = clib_host_to_net_u64 (tmp);
|
||||||
|
*mac = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
static void vl_api_create_loopback_reply_t_handler
|
static void vl_api_create_loopback_reply_t_handler
|
||||||
(vl_api_create_loopback_reply_t * mp)
|
(vl_api_create_loopback_reply_t * mp)
|
||||||
@ -3909,6 +3918,9 @@ static int api_l2fib_add_del (vat_main_t * vam)
|
|||||||
u8 static_mac = 0;
|
u8 static_mac = 0;
|
||||||
u8 filter_mac = 0;
|
u8 filter_mac = 0;
|
||||||
u8 bvi_mac = 0;
|
u8 bvi_mac = 0;
|
||||||
|
int count = 1;
|
||||||
|
f64 before = 0;
|
||||||
|
int j;
|
||||||
|
|
||||||
/* Parse args required to build the message */
|
/* Parse args required to build the message */
|
||||||
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
|
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
|
||||||
@ -3920,22 +3932,24 @@ static int api_l2fib_add_del (vat_main_t * vam)
|
|||||||
sw_if_index_set = 1;
|
sw_if_index_set = 1;
|
||||||
else if (unformat (i, "sw_if")) {
|
else if (unformat (i, "sw_if")) {
|
||||||
if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
|
if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
|
||||||
if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
|
if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
|
||||||
sw_if_index_set = 1;
|
sw_if_index_set = 1;
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
} else if (unformat (i, "static"))
|
} else if (unformat (i, "static"))
|
||||||
static_mac = 1;
|
static_mac = 1;
|
||||||
else if (unformat (i, "filter")) {
|
else if (unformat (i, "filter")) {
|
||||||
filter_mac = 1;
|
filter_mac = 1;
|
||||||
static_mac = 1;
|
static_mac = 1;
|
||||||
} else if (unformat (i, "bvi")) {
|
} else if (unformat (i, "bvi")) {
|
||||||
bvi_mac = 1;
|
bvi_mac = 1;
|
||||||
static_mac = 1;
|
static_mac = 1;
|
||||||
} else if (unformat (i, "del"))
|
} else if (unformat (i, "del"))
|
||||||
is_add = 0;
|
is_add = 0;
|
||||||
|
else if (unformat (i, "count %d", &count))
|
||||||
|
;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mac_set == 0) {
|
if (mac_set == 0) {
|
||||||
@ -3953,22 +3967,66 @@ static int api_l2fib_add_del (vat_main_t * vam)
|
|||||||
return -99;
|
return -99;
|
||||||
}
|
}
|
||||||
|
|
||||||
M(L2FIB_ADD_DEL, l2fib_add_del);
|
if (count > 1) {
|
||||||
|
/* Turn on async mode */
|
||||||
mp->mac = mac;
|
vam->async_mode = 1;
|
||||||
mp->bd_id = ntohl(bd_id);
|
vam->async_errors = 0;
|
||||||
mp->is_add = is_add;
|
before = vat_time_now(vam);
|
||||||
|
|
||||||
if (is_add) {
|
|
||||||
mp->sw_if_index = ntohl(sw_if_index);
|
|
||||||
mp->static_mac = static_mac;
|
|
||||||
mp->filter_mac = filter_mac;
|
|
||||||
mp->bvi_mac = bvi_mac;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
S; W;
|
for (j = 0; j < count; j++) {
|
||||||
/* NOTREACHED */
|
M(L2FIB_ADD_DEL, l2fib_add_del);
|
||||||
return 0;
|
|
||||||
|
mp->mac = mac;
|
||||||
|
mp->bd_id = ntohl(bd_id);
|
||||||
|
mp->is_add = is_add;
|
||||||
|
|
||||||
|
if (is_add) {
|
||||||
|
mp->sw_if_index = ntohl(sw_if_index);
|
||||||
|
mp->static_mac = static_mac;
|
||||||
|
mp->filter_mac = filter_mac;
|
||||||
|
mp->bvi_mac = bvi_mac;
|
||||||
|
}
|
||||||
|
increment_mac_address (&mac);
|
||||||
|
/* send it... */
|
||||||
|
S;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 1) {
|
||||||
|
vl_api_control_ping_t * mp;
|
||||||
|
f64 after;
|
||||||
|
|
||||||
|
/* Shut off async mode */
|
||||||
|
vam->async_mode = 0;
|
||||||
|
|
||||||
|
M(CONTROL_PING, control_ping);
|
||||||
|
S;
|
||||||
|
|
||||||
|
timeout = vat_time_now(vam) + 1.0;
|
||||||
|
while (vat_time_now (vam) < timeout)
|
||||||
|
if (vam->result_ready == 1)
|
||||||
|
goto out;
|
||||||
|
vam->retval = -99;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (vam->retval == -99)
|
||||||
|
errmsg ("timeout\n");
|
||||||
|
|
||||||
|
if (vam->async_errors > 0) {
|
||||||
|
errmsg ("%d asynchronous errors\n", vam->async_errors);
|
||||||
|
vam->retval = -98;
|
||||||
|
}
|
||||||
|
vam->async_errors = 0;
|
||||||
|
after = vat_time_now(vam);
|
||||||
|
|
||||||
|
fformat(vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
|
||||||
|
count, after - before, count / (after - before));
|
||||||
|
} else {
|
||||||
|
/* Wait for a reply... */
|
||||||
|
W;
|
||||||
|
}
|
||||||
|
/* Return the good/bad news */
|
||||||
|
return (vam->retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int api_l2_flags (vat_main_t * vam)
|
static int api_l2_flags (vat_main_t * vam)
|
||||||
@ -12214,7 +12272,7 @@ _(bridge_domain_add_del, \
|
|||||||
"bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
|
"bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
|
||||||
_(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
|
_(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
|
||||||
_(l2fib_add_del, \
|
_(l2fib_add_del, \
|
||||||
"mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi]\n") \
|
"mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
|
||||||
_(l2_flags, \
|
_(l2_flags, \
|
||||||
"sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
|
"sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
|
||||||
_(bridge_flags, \
|
_(bridge_flags, \
|
||||||
|
Reference in New Issue
Block a user