diff options
-rw-r--r-- | src/segtree.c | 20 | ||||
-rw-r--r-- | tests/py/ip6/srh.t | 6 |
2 files changed, 15 insertions, 11 deletions
diff --git a/src/segtree.c b/src/segtree.c index 1970265a..5939d8fc 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -857,21 +857,25 @@ void interval_map_decompose(struct expr *set) expr_free(i); } - /* Unclosed interval */ - if (low != NULL) { - i = constant_expr_alloc(&low->location, low->dtype, - low->byteorder, expr_value(low)->len, - NULL); - mpz_init_bitmask(i->value, i->len); + if (!low) /* no unclosed interval at end */ + goto out; + i = constant_expr_alloc(&low->location, low->dtype, + low->byteorder, expr_value(low)->len, NULL); + mpz_init_bitmask(i->value, i->len); + + if (!mpz_cmp(i->value, expr_value(low)->value)) { + expr_free(i); + i = low; + } else { i = range_expr_alloc(&low->location, expr_value(low), i); i = set_elem_expr_alloc(&low->location, i); if (low->ops->type == EXPR_MAPPING) i = mapping_expr_alloc(&i->location, i, low->right); - - compound_expr_add(set, i); } + compound_expr_add(set, i); +out: mpz_clear(range); mpz_clear(p); diff --git a/tests/py/ip6/srh.t b/tests/py/ip6/srh.t index 442c78f0..fbaff410 100644 --- a/tests/py/ip6/srh.t +++ b/tests/py/ip6/srh.t @@ -4,15 +4,15 @@ srh last-entry 0;ok srh last-entry 127;ok -srh last-entry { 0, 4-127, 255 };ok;srh last-entry { 0, 4-127, 255-255} +srh last-entry { 0, 4-127, 255 };ok srh flags 0;ok srh flags 127;ok -srh flags { 0, 4-127, 255 };ok;srh flags { 0, 4-127, 255-255} +srh flags { 0, 4-127, 255 };ok srh tag 0;ok srh tag 127;ok -srh tag { 0, 4-127, 0xffff };ok;srh tag { 0, 4-127, 65535-65535} +srh tag { 0, 4-127, 0xffff };ok;srh tag { 0, 4-127, 65535 } srh sid[1] dead::beef;ok srh sid[2] dead::beef;ok |