diff options
| author | Lou Berger <lberger@labn.net> | 2022-10-21 11:12:11 +0000 | 
|---|---|---|
| committer | Lou Berger <lberger@labn.net> | 2022-10-21 15:08:53 +0000 | 
| commit | 08172828f6dc0950431e57e43b0aa2dc674cb6fe (patch) | |
| tree | f8d4a9379ec7fb406f452927b816646655783cb0 | |
| parent | e1a14d470011dd0368c272f7763e371b725c57f6 (diff) | |
ospfd: ospf_apiserver.c - fix link local opaque LSA delete
Signed-off-by: Lou Berger <lberger@labn.net>
| -rw-r--r-- | ospfclient/ospf_apiclient.c | 6 | ||||
| -rw-r--r-- | ospfclient/ospf_apiclient.h | 2 | ||||
| -rw-r--r-- | ospfd/ospf_api.c | 4 | ||||
| -rw-r--r-- | ospfd/ospf_api.h | 5 | ||||
| -rw-r--r-- | ospfd/ospf_apiserver.c | 14 | 
5 files changed, 20 insertions, 11 deletions
diff --git a/ospfclient/ospf_apiclient.c b/ospfclient/ospf_apiclient.c index b5e6389d4c..ae07724da2 100644 --- a/ospfclient/ospf_apiclient.c +++ b/ospfclient/ospf_apiclient.c @@ -481,7 +481,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; @@ -496,8 +496,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;  		}  | 
