summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLou Berger <lberger@labn.net>2022-10-21 11:12:11 +0000
committerMergify <37929162+mergify[bot]@users.noreply.github.com>2022-10-29 14:38:45 +0000
commitd6eda57ab057d3c44373428a3e23c5c53e4bc105 (patch)
treea2f8f297f720e28baca7e38195318650e5c9de8a
parent99267afe94eb286cf3f55db4244982022058096a (diff)
ospfd: ospf_apiserver.c - fix link local opaque LSA delete
Signed-off-by: Lou Berger <lberger@labn.net> (cherry picked from commit 08172828f6dc0950431e57e43b0aa2dc674cb6fe)
-rw-r--r--ospfclient/ospf_apiclient.c6
-rw-r--r--ospfclient/ospf_apiclient.h2
-rw-r--r--ospfd/ospf_api.c4
-rw-r--r--ospfd/ospf_api.h5
-rw-r--r--ospfd/ospf_apiserver.c14
5 files changed, 20 insertions, 11 deletions
diff --git a/ospfclient/ospf_apiclient.c b/ospfclient/ospf_apiclient.c
index b5f5d77d82..155e3fab40 100644
--- a/ospfclient/ospf_apiclient.c
+++ b/ospfclient/ospf_apiclient.c
@@ -487,7 +487,7 @@ int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient,
}
int ospf_apiclient_lsa_delete(struct ospf_apiclient *oclient,
- struct in_addr area_id, uint8_t lsa_type,
+ struct in_addr addr, uint8_t lsa_type,
uint8_t opaque_type, uint32_t opaque_id)
{
struct msg *msg;
@@ -502,8 +502,8 @@ int ospf_apiclient_lsa_delete(struct ospf_apiclient *oclient,
/* opaque_id is in host byte order and will be converted
* to network byte order by new_msg_delete_request */
- msg = new_msg_delete_request(ospf_apiclient_get_seqnr(), area_id,
- lsa_type, opaque_type, opaque_id);
+ msg = new_msg_delete_request(ospf_apiclient_get_seqnr(), addr, lsa_type,
+ opaque_type, opaque_id);
rc = ospf_apiclient_send_request(oclient, msg);
return rc;
diff --git a/ospfclient/ospf_apiclient.h b/ospfclient/ospf_apiclient.h
index 6d1eb7f64f..cbdb250141 100644
--- a/ospfclient/ospf_apiclient.h
+++ b/ospfclient/ospf_apiclient.h
@@ -94,7 +94,7 @@ int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient,
/* Synchronous request to delete opaque LSA. Parameter opaque_id is in
host byte order */
int ospf_apiclient_lsa_delete(struct ospf_apiclient *oclient,
- struct in_addr area_id, uint8_t lsa_type,
+ struct in_addr addr, uint8_t lsa_type,
uint8_t opaque_type, uint32_t opaque_id);
/* Fetch async message and handle it */
diff --git a/ospfd/ospf_api.c b/ospfd/ospf_api.c
index 8636db450b..59ec016f1e 100644
--- a/ospfd/ospf_api.c
+++ b/ospfd/ospf_api.c
@@ -532,12 +532,12 @@ struct msg *new_msg_originate_request(uint32_t seqnum, struct in_addr ifaddr,
return msg_new(MSG_ORIGINATE_REQUEST, omsg, seqnum, omsglen);
}
-struct msg *new_msg_delete_request(uint32_t seqnum, struct in_addr area_id,
+struct msg *new_msg_delete_request(uint32_t seqnum, struct in_addr addr,
uint8_t lsa_type, uint8_t opaque_type,
uint32_t opaque_id)
{
struct msg_delete_request dmsg;
- dmsg.area_id = area_id;
+ dmsg.addr = addr;
dmsg.lsa_type = lsa_type;
dmsg.opaque_type = opaque_type;
dmsg.opaque_id = htonl(opaque_id);
diff --git a/ospfd/ospf_api.h b/ospfd/ospf_api.h
index 51c8c52ce5..589e650bbd 100644
--- a/ospfd/ospf_api.h
+++ b/ospfd/ospf_api.h
@@ -186,7 +186,7 @@ struct msg_originate_request {
};
struct msg_delete_request {
- struct in_addr area_id; /* "0.0.0.0" for AS-external opaque LSAs */
+ struct in_addr addr; /* intf IP for link local, area for type 10, "0.0.0.0" for AS-external */
uint8_t lsa_type;
uint8_t opaque_type;
uint8_t pad[2]; /* padding */
@@ -311,8 +311,7 @@ extern struct msg *new_msg_originate_request(uint32_t seqnum,
struct in_addr ifaddr,
struct in_addr area_id,
struct lsa_header *data);
-extern struct msg *new_msg_delete_request(uint32_t seqnum,
- struct in_addr area_id,
+extern struct msg *new_msg_delete_request(uint32_t seqnum, struct in_addr addr,
uint8_t lsa_type, uint8_t opaque_type,
uint32_t opaque_id);
diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c
index f5ed77dab5..684e4c3d5b 100644
--- a/ospfd/ospf_apiserver.c
+++ b/ospfd/ospf_apiserver.c
@@ -1924,6 +1924,7 @@ int ospf_apiserver_handle_delete_request(struct ospf_apiserver *apiserv,
struct msg_delete_request *dmsg;
struct ospf_lsa *old;
struct ospf_area *area = NULL;
+ struct ospf_interface *oi = NULL;
struct in_addr id;
int lsa_type, opaque_type;
int rc = 0;
@@ -1938,11 +1939,20 @@ int ospf_apiserver_handle_delete_request(struct ospf_apiserver *apiserv,
/* Lookup area for link-local and area-local opaque LSAs */
switch (dmsg->lsa_type) {
case OSPF_OPAQUE_LINK_LSA:
+ oi = ospf_apiserver_if_lookup_by_addr(dmsg->addr);
+ if (!oi) {
+ zlog_warn("%s: unknown interface %pI4", __func__,
+ &dmsg->addr);
+ rc = OSPF_API_NOSUCHINTERFACE;
+ goto out;
+ }
+ area = oi->area;
+ break;
case OSPF_OPAQUE_AREA_LSA:
- area = ospf_area_lookup_by_area_id(ospf, dmsg->area_id);
+ area = ospf_area_lookup_by_area_id(ospf, dmsg->addr);
if (!area) {
zlog_warn("%s: unknown area %pI4", __func__,
- &dmsg->area_id);
+ &dmsg->addr);
rc = OSPF_API_NOSUCHAREA;
goto out;
}