From cf121c8313187819245e45f11fb49ba1e1ea53ef Mon Sep 17 00:00:00 2001 From: Filip Tehlar Date: Wed, 3 May 2017 10:12:44 +0200 Subject: [PATCH] LISP: group mapping records in map-register message Change-Id: I546c761acfbf880717163a035aa691b04337b7bf Signed-off-by: Filip Tehlar --- src/vnet/lisp-cp/control.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/vnet/lisp-cp/control.c b/src/vnet/lisp-cp/control.c index c0093301307..ddaa6f508dc 100644 --- a/src/vnet/lisp-cp/control.c +++ b/src/vnet/lisp-cp/control.c @@ -2454,7 +2454,7 @@ send_map_register (lisp_cp_main_t * lcm, u8 want_map_notif) u64 nonce = 0; u32 next_index, *to_next; ip_address_t *ms = 0; - mapping_t *records, *r, *g; + mapping_t *records, *r, *group, *k; // TODO: support multiple map servers and do election if (0 == vec_len (lcm->map_servers)) @@ -2481,12 +2481,25 @@ send_map_register (lisp_cp_main_t * lcm, u8 want_map_notif) if (!key) continue; /* no secret key -> map-register cannot be sent */ - g = 0; - // TODO: group mappings that share common key - vec_add1 (g, r[0]); - b = build_map_register (lcm, &sloc, ms, &nonce, want_map_notif, g, + group = 0; + vec_add1 (group, r[0]); + + /* group mappings that share common key */ + for (k = r + 1; k < vec_end (records); k++) + { + if (k->key_id != r->key_id) + continue; + + if (vec_is_equal (k->key, r->key)) + { + vec_add1 (group, k[0]); + k->key = 0; /* don't process this mapping again */ + } + } + + b = build_map_register (lcm, &sloc, ms, &nonce, want_map_notif, group, key_id, key, &bi); - vec_free (g); + vec_free (group); if (!b) continue; -- 2.16.6