Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vtep: add an option to have no multicast #528

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I prefer if (!unicast && state->flags & PG_VTEP_NO_MULTICAST)
we don't have to do this state->flags & PG_VTEP_NO_MULTICAST operation if unicast==true

/* in this case all we can do is to skip the packet */
*maskp &= ~i;
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))) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, i prefer unlikely(pg_is_multicast_ip(port->multicast_ip))first

*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