diff options
Diffstat (limited to 'src/vnet')
-rw-r--r-- | src/vnet/dpo/dpo.c | 9 | ||||
-rw-r--r-- | src/vnet/dpo/dpo.h | 39 |
2 files changed, 29 insertions, 19 deletions
diff --git a/src/vnet/dpo/dpo.c b/src/vnet/dpo/dpo.c index d5865d13a1d..1331b5501bc 100644 --- a/src/vnet/dpo/dpo.c +++ b/src/vnet/dpo/dpo.c @@ -262,13 +262,15 @@ void dpo_copy (dpo_id_t *dst, const dpo_id_t *src) { - dpo_id_t tmp = *dst; + dpo_id_t tmp = { + .as_u64 = dst->as_u64 + }; /* * the destination is written in a single u64 write - hence atomically w.r.t * any packets inflight. */ - *((u64*)dst) = *(u64*)src; + dst->as_u64 = src->as_u64; dpo_lock(dst); dpo_unlock(&tmp); @@ -279,6 +281,9 @@ dpo_is_adj (const dpo_id_t *dpo) { return ((dpo->dpoi_type == DPO_ADJACENCY) || (dpo->dpoi_type == DPO_ADJACENCY_INCOMPLETE) || + (dpo->dpoi_type == DPO_ADJACENCY_GLEAN) || + (dpo->dpoi_type == DPO_ADJACENCY_MCAST) || + (dpo->dpoi_type == DPO_ADJACENCY_MCAST_MIDCHAIN) || (dpo->dpoi_type == DPO_ADJACENCY_MIDCHAIN) || (dpo->dpoi_type == DPO_ADJACENCY_GLEAN)); } diff --git a/src/vnet/dpo/dpo.h b/src/vnet/dpo/dpo.h index e5a9bdc1ca1..ee4990d0058 100644 --- a/src/vnet/dpo/dpo.h +++ b/src/vnet/dpo/dpo.h @@ -168,23 +168,28 @@ typedef enum dpo_type_t_ { * instance number/index of objects of that type */ typedef struct dpo_id_t_ { - /** - * the type - */ - dpo_type_t dpoi_type; - /** - * the data-path protocol of the type. - */ - dpo_proto_t dpoi_proto; - /** - * The next VLIB node to follow. - */ - u16 dpoi_next_node; - /** - * the index of objects of that type - */ - index_t dpoi_index; -} __attribute__ ((aligned(sizeof(u64)))) dpo_id_t; + union { + struct { + /** + * the type + */ + dpo_type_t dpoi_type; + /** + * the data-path protocol of the type. + */ + dpo_proto_t dpoi_proto; + /** + * The next VLIB node to follow. + */ + u16 dpoi_next_node; + /** + * the index of objects of that type + */ + index_t dpoi_index; + }; + u64 as_u64; + }; +} dpo_id_t; STATIC_ASSERT(sizeof(dpo_id_t) <= sizeof(u64), "DPO ID is greater than sizeof u64 " |