diff options
author | Philippe Guibert <philippe.guibert@6wind.com> | 2023-04-20 18:33:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-20 18:33:21 +0200 |
commit | 7b343a9ed5381d6e66cb68a6aa396d2194de7444 (patch) | |
tree | ce55d7f53e9f05634719b44217cf132bb4ebc952 /ospfd/ospf_te.c | |
parent | Merge pull request #13329 from Pdoijode/pdoijode/bgp-attr-crash-fix (diff) | |
parent | tests: Update TE topotests to follow new Edge Key (diff) | |
download | frr-7b343a9ed5381d6e66cb68a6aa396d2194de7444.tar.xz frr-7b343a9ed5381d6e66cb68a6aa396d2194de7444.zip |
Merge pull request #12933 from Orange-OpenSource/link_state
lib: Update edge key in link state database
Diffstat (limited to 'ospfd/ospf_te.c')
-rw-r--r-- | ospfd/ospf_te.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c index 5f83e1c2c..3cf39e5fb 100644 --- a/ospfd/ospf_te.c +++ b/ospfd/ospf_te.c @@ -1665,12 +1665,13 @@ static struct ls_vertex *get_vertex(struct ls_ted *ted, struct ospf_lsa *lsa) static struct ls_edge *get_edge(struct ls_ted *ted, struct ls_node_id adv, struct in_addr link_id) { - uint64_t key; + struct ls_edge_key key; struct ls_edge *edge; struct ls_attributes *attr; /* Search Edge that corresponds to the Link ID */ - key = ((uint64_t)ntohl(link_id.s_addr)) & 0xffffffff; + key.family = AF_INET; + IPV4_ADDR_COPY(&key.k.addr, &link_id); edge = ls_find_edge_by_key(ted, key); /* Create new one if not exist */ @@ -2350,7 +2351,7 @@ static int ospf_te_delete_te(struct ls_ted *ted, struct ospf_lsa *lsa) struct ls_attributes *attr; struct tlv_header *tlvh; struct in_addr addr; - uint64_t key = 0; + struct ls_edge_key key = {.family = AF_UNSPEC}; uint16_t len, sum; uint8_t lsa_id; @@ -2366,12 +2367,13 @@ static int ospf_te_delete_te(struct ls_ted *ted, struct ospf_lsa *lsa) for (tlvh = TLV_DATA(tlvh); sum < len; tlvh = TLV_HDR_NEXT(tlvh)) { if (ntohs(tlvh->type) == TE_LINK_SUBTLV_LCLIF_IPADDR) { memcpy(&addr, TLV_DATA(tlvh), TE_LINK_SUBTLV_DEF_SIZE); - key = ((uint64_t)ntohl(addr.s_addr)) & 0xffffffff; + key.family = AF_INET; + IPV4_ADDR_COPY(&key.k.addr, &addr); break; } sum += TLV_SIZE(tlvh); } - if (key == 0) + if (key.family == AF_UNSPEC) return 0; /* Search Edge that corresponds to the Link ID */ @@ -2862,11 +2864,12 @@ static int ospf_te_delete_ext_link(struct ls_ted *ted, struct ospf_lsa *lsa) struct ls_edge *edge; struct ls_attributes *atr; struct ext_tlv_link *ext; - uint64_t key; + struct ls_edge_key key; /* Search for corresponding Edge from Link State Data Base */ ext = (struct ext_tlv_link *)TLV_HDR_TOP(lsa->data); - key = ((uint64_t)ntohl(ext->link_data.s_addr)) & 0xffffffff; + key.family = AF_INET; + IPV4_ADDR_COPY(&key.k.addr, &ext->link_data); edge = ls_find_edge_by_key(ted, key); /* Check if there is a corresponding Edge */ @@ -4298,6 +4301,7 @@ DEFUN (show_ip_ospf_mpls_te_db, struct ls_edge *edge; struct ls_subnet *subnet; uint64_t key; + struct ls_edge_key ekey; bool verbose = false; bool uj = use_json(argc, argv); json_object *json = NULL; @@ -4351,8 +4355,9 @@ DEFUN (show_ip_ospf_mpls_te_db, return CMD_WARNING_CONFIG_FAILED; } /* Get the Edge from the Link State Database */ - key = ((uint64_t)ntohl(ip_addr.s_addr)) & 0xffffffff; - edge = ls_find_edge_by_key(OspfMplsTE.ted, key); + ekey.family = AF_INET; + IPV4_ADDR_COPY(&ekey.k.addr, &ip_addr); + edge = ls_find_edge_by_key(OspfMplsTE.ted, ekey); if (!edge) { vty_out(vty, "No edge found for ID %pI4\n", &ip_addr); |