forked from Mirror/frr
ospfd: ospf_apiserver.c - fix link local opaque LSA delete
Signed-off-by: Lou Berger <lberger@labn.net>
This commit is contained in:
parent
e1a14d4700
commit
08172828f6
|
@ -481,7 +481,7 @@ int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient,
|
||||||
}
|
}
|
||||||
|
|
||||||
int ospf_apiclient_lsa_delete(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)
|
uint8_t opaque_type, uint32_t opaque_id)
|
||||||
{
|
{
|
||||||
struct msg *msg;
|
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
|
/* opaque_id is in host byte order and will be converted
|
||||||
* to network byte order by new_msg_delete_request */
|
* to network byte order by new_msg_delete_request */
|
||||||
msg = new_msg_delete_request(ospf_apiclient_get_seqnr(), area_id,
|
msg = new_msg_delete_request(ospf_apiclient_get_seqnr(), addr, lsa_type,
|
||||||
lsa_type, opaque_type, opaque_id);
|
opaque_type, opaque_id);
|
||||||
|
|
||||||
rc = ospf_apiclient_send_request(oclient, msg);
|
rc = ospf_apiclient_send_request(oclient, msg);
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -94,7 +94,7 @@ int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient,
|
||||||
/* Synchronous request to delete opaque LSA. Parameter opaque_id is in
|
/* Synchronous request to delete opaque LSA. Parameter opaque_id is in
|
||||||
host byte order */
|
host byte order */
|
||||||
int ospf_apiclient_lsa_delete(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);
|
uint8_t opaque_type, uint32_t opaque_id);
|
||||||
|
|
||||||
/* Fetch async message and handle it */
|
/* Fetch async message and handle it */
|
||||||
|
|
|
@ -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);
|
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,
|
uint8_t lsa_type, uint8_t opaque_type,
|
||||||
uint32_t opaque_id)
|
uint32_t opaque_id)
|
||||||
{
|
{
|
||||||
struct msg_delete_request dmsg;
|
struct msg_delete_request dmsg;
|
||||||
dmsg.area_id = area_id;
|
dmsg.addr = addr;
|
||||||
dmsg.lsa_type = lsa_type;
|
dmsg.lsa_type = lsa_type;
|
||||||
dmsg.opaque_type = opaque_type;
|
dmsg.opaque_type = opaque_type;
|
||||||
dmsg.opaque_id = htonl(opaque_id);
|
dmsg.opaque_id = htonl(opaque_id);
|
||||||
|
|
|
@ -186,7 +186,7 @@ struct msg_originate_request {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct msg_delete_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 lsa_type;
|
||||||
uint8_t opaque_type;
|
uint8_t opaque_type;
|
||||||
uint8_t pad[2]; /* padding */
|
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 ifaddr,
|
||||||
struct in_addr area_id,
|
struct in_addr area_id,
|
||||||
struct lsa_header *data);
|
struct lsa_header *data);
|
||||||
extern struct msg *new_msg_delete_request(uint32_t seqnum,
|
extern struct msg *new_msg_delete_request(uint32_t seqnum, struct in_addr addr,
|
||||||
struct in_addr area_id,
|
|
||||||
uint8_t lsa_type, uint8_t opaque_type,
|
uint8_t lsa_type, uint8_t opaque_type,
|
||||||
uint32_t opaque_id);
|
uint32_t opaque_id);
|
||||||
|
|
||||||
|
|
|
@ -1924,6 +1924,7 @@ int ospf_apiserver_handle_delete_request(struct ospf_apiserver *apiserv,
|
||||||
struct msg_delete_request *dmsg;
|
struct msg_delete_request *dmsg;
|
||||||
struct ospf_lsa *old;
|
struct ospf_lsa *old;
|
||||||
struct ospf_area *area = NULL;
|
struct ospf_area *area = NULL;
|
||||||
|
struct ospf_interface *oi = NULL;
|
||||||
struct in_addr id;
|
struct in_addr id;
|
||||||
int lsa_type, opaque_type;
|
int lsa_type, opaque_type;
|
||||||
int rc = 0;
|
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 */
|
/* Lookup area for link-local and area-local opaque LSAs */
|
||||||
switch (dmsg->lsa_type) {
|
switch (dmsg->lsa_type) {
|
||||||
case OSPF_OPAQUE_LINK_LSA:
|
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:
|
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) {
|
if (!area) {
|
||||||
zlog_warn("%s: unknown area %pI4", __func__,
|
zlog_warn("%s: unknown area %pI4", __func__,
|
||||||
&dmsg->area_id);
|
&dmsg->addr);
|
||||||
rc = OSPF_API_NOSUCHAREA;
|
rc = OSPF_API_NOSUCHAREA;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue