Skip to content

Commit

Permalink
vtep: add an option to have no multicast
Browse files Browse the repository at this point in the history
Signed-off-by: Matthias Gatto <[email protected]>
  • Loading branch information
outscale-mgo committed May 11, 2020
1 parent e73b18b commit 2b4b142
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 16 deletions.
5 changes: 4 additions & 1 deletion include/packetgraph/vtep.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ enum pg_vtep_flags {
* when incoming packets, just forward it */
PG_VTEP_NO_INNERMAC_CHECK = 2,
PG_VTEP_FORCE_UPD_IPV6_CHECKSUM = 4,
PG_VTEP_ALL_OPTI = PG_VTEP_NO_COPY | PG_VTEP_NO_INNERMAC_CHECK
PG_VTEP_ALL_OPTI = PG_VTEP_NO_COPY | PG_VTEP_NO_INNERMAC_CHECK,
/* in this mode we don't do multicast,
dst mac must be add manually */
PG_VTEP_NO_MULTICAST = 8
};

struct ether_addr;
Expand Down
38 changes: 23 additions & 15 deletions src/vtep-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -355,10 +355,12 @@ static inline int vtep_header_prepend(struct vtep_state *state,

static inline int vtep_encapsulate(struct vtep_state *state,
struct vtep_port *port,
struct rte_mbuf **pkts, uint64_t pkts_mask,
struct rte_mbuf **pkts,
uint64_t *maskp,
struct pg_error **errp)
{
struct rte_mempool *mp = pg_get_mempool();
uint64_t pkts_mask = *maskp;

/* do the encapsulation */
for (; pkts_mask;) {
Expand Down Expand Up @@ -388,6 +390,12 @@ static inline int vtep_encapsulate(struct vtep_state *state,
unicast = 0;
}

if (state->flags & PG_VTEP_NO_MULTICAST && !unicast) {
/* in this case all we can do is to skip the packet */
*maskp &= ~(i + 1);
continue;
}

if (unlikely(!(state->flags & PG_VTEP_NO_COPY))) {
tmp = rte_pktmbuf_clone(pkt, mp);
if (unlikely(!tmp))
Expand Down Expand Up @@ -459,11 +467,15 @@ static inline int to_vtep(struct pg_brick *brick, enum pg_side from,
if (unlikely(are_mac_tables_dead(port) &&
try_fix_tables(state, port, errp) < 0))
return -1;
/* if the port VNI is not set up ignore the packets */
if (unlikely(!pg_is_multicast_ip(port->multicast_ip)))
return 0;

if (unlikely(vtep_encapsulate(state, port, pkts, pkts_mask, errp) < 0))
if (!(state->flags & PG_VTEP_NO_MULTICAST)) {
/* if the port VNI is not set up ignore the packets */
if (unlikely(!pg_is_multicast_ip(port->multicast_ip)))
return 0;
}

if (unlikely(vtep_encapsulate(state, port, pkts,
&pkts_mask, errp) < 0))
return -1;

ret = pg_brick_side_forward(s, from, state->pkts, pkts_mask, errp);
Expand Down Expand Up @@ -795,7 +807,8 @@ static int do_add_vni(struct vtep_state *state, uint16_t edge_index,
*errp = pg_error_new("port already attached to a vni");
return -1;
}
if (unlikely(pg_is_multicast_ip(port->multicast_ip))) {
if (!(state->flags & PG_VTEP_NO_MULTICAST) &&
unlikely(pg_is_multicast_ip(port->multicast_ip))) {
*errp = pg_error_new("port alread have a mutlicast IP");
return -1;
}
Expand All @@ -806,7 +819,8 @@ static int do_add_vni(struct vtep_state *state, uint16_t edge_index,
g_assert(!pg_mac_table_init(&port->mac_to_dst, &state->exeption_env));
g_assert(!pg_mac_table_init(&port->known_mac, &state->exeption_env));

multicast_subscribe(state, port, multicast_ip, errp);
if (!(state->flags & PG_VTEP_NO_MULTICAST))
multicast_subscribe(state, port, multicast_ip, errp);
return 0;
}

Expand All @@ -827,8 +841,8 @@ static void do_remove_vni(struct vtep_state *state,
if (!pg_is_multicast_ip(port->multicast_ip))
return;

multicast_unsubscribe(state, port, port->multicast_ip,
errp);
if (!(state->flags & PG_VTEP_NO_MULTICAST))
multicast_unsubscribe(state, port, port->multicast_ip, errp);

if (pg_error_is_set(errp))
return;
Expand Down Expand Up @@ -1053,12 +1067,6 @@ int pg_vtep_add_vni_(struct pg_brick *brick,

pg_ip_copy(multicast_ip, &tmp_ip);

if (!pg_is_multicast_ip(tmp_ip)) {
*errp = pg_error_new(
"Provided IP is not in the multicast range");
return -1;
}

/* lookup for the vtep brick index */
found = 0;
for (i = 0; i < brick->sides[side].max; i++)
Expand Down

0 comments on commit 2b4b142

Please sign in to comment.