diff options
author | Lou Berger <lberger@labn.net> | 2022-10-16 17:19:37 +0200 |
---|---|---|
committer | Lou Berger <lberger@labn.net> | 2022-10-21 17:27:58 +0200 |
commit | 2f30cb25747dc9657046c59ca1f378203192de26 (patch) | |
tree | e064c47134e510a7544f9990a92692e5e657fe4e /ospfclient | |
parent | ospfd: ospf_apiserver.c - fix link local opaque LSA delete (diff) | |
download | frr-2f30cb25747dc9657046c59ca1f378203192de26.tar.xz frr-2f30cb25747dc9657046c59ca1f378203192de26.zip |
ospfd/ospfclient: add option to flush/withdrawal with zero length
default behavior is unchanged, i.e., to not zero
Signed-off-by: Lou Berger <lberger@labn.net>
Diffstat (limited to 'ospfclient')
-rw-r--r-- | ospfclient/ospf_apiclient.c | 5 | ||||
-rw-r--r-- | ospfclient/ospf_apiclient.h | 3 | ||||
-rw-r--r-- | ospfclient/ospfclient.c | 7 | ||||
-rwxr-xr-x | ospfclient/ospfclient.py | 45 |
4 files changed, 37 insertions, 23 deletions
diff --git a/ospfclient/ospf_apiclient.c b/ospfclient/ospf_apiclient.c index ae07724da..05c5e7789 100644 --- a/ospfclient/ospf_apiclient.c +++ b/ospfclient/ospf_apiclient.c @@ -482,7 +482,8 @@ int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient, int ospf_apiclient_lsa_delete(struct ospf_apiclient *oclient, struct in_addr addr, uint8_t lsa_type, - uint8_t opaque_type, uint32_t opaque_id) + uint8_t opaque_type, uint32_t opaque_id, + uint8_t flags) { struct msg *msg; int rc; @@ -497,7 +498,7 @@ 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(), addr, lsa_type, - opaque_type, opaque_id); + opaque_type, opaque_id, flags); rc = ospf_apiclient_send_request(oclient, msg); return rc; diff --git a/ospfclient/ospf_apiclient.h b/ospfclient/ospf_apiclient.h index cbdb25014..b904937c2 100644 --- a/ospfclient/ospf_apiclient.h +++ b/ospfclient/ospf_apiclient.h @@ -95,7 +95,8 @@ int ospf_apiclient_lsa_originate(struct ospf_apiclient *oclient, host byte order */ int ospf_apiclient_lsa_delete(struct ospf_apiclient *oclient, struct in_addr addr, uint8_t lsa_type, - uint8_t opaque_type, uint32_t opaque_id); + uint8_t opaque_type, uint32_t opaque_id, + uint8_t flags); /* Fetch async message and handle it */ int ospf_apiclient_handle_async(struct ospf_apiclient *oclient); diff --git a/ospfclient/ospfclient.c b/ospfclient/ospfclient.c index 3cfee7d57..edf814184 100644 --- a/ospfclient/ospfclient.c +++ b/ospfclient/ospfclient.c @@ -98,9 +98,10 @@ static void lsa_delete(struct thread *t) printf("Deleting LSA... "); rc = ospf_apiclient_lsa_delete(oclient, area_id, - atoi(args[2]), /* lsa type */ - atoi(args[3]), /* opaque type */ - atoi(args[4])); /* opaque ID */ + atoi(args[2]), /* lsa type */ + atoi(args[3]), /* opaque type */ + atoi(args[4]), /* opaque ID */ + 0); /* send data in withdrawals */ printf("done, return code is = %d\n", rc); } diff --git a/ospfclient/ospfclient.py b/ospfclient/ospfclient.py index 19561145a..8e3c68445 100755 --- a/ospfclient/ospfclient.py +++ b/ospfclient/ospfclient.py @@ -62,13 +62,16 @@ smsg_info = { MSG_REGISTER_EVENT: ("REGISTER_EVENT", FMT_LSA_FILTER), MSG_SYNC_LSDB: ("SYNC_LSDB", FMT_LSA_FILTER), MSG_ORIGINATE_REQUEST: ("ORIGINATE_REQUEST", ">II" + FMT_LSA_HEADER[1:]), - MSG_DELETE_REQUEST: ("DELETE_REQUEST", ">IBBxxL"), + MSG_DELETE_REQUEST: ("DELETE_REQUEST", ">IBBxBL"), MSG_SYNC_REACHABLE: ("MSG_SYNC_REACHABLE", ""), MSG_SYNC_ISM: ("MSG_SYNC_ISM", ""), MSG_SYNC_NSM: ("MSG_SYNC_NSM", ""), MSG_SYNC_ROUTER_ID: ("MSG_SYNC_ROUTER_ID", ""), } +# OSPF API MSG Delete Flag. +OSPF_API_DEL_ZERO_LEN_LSA = 0x01 # send withdrawal with no LSA data + # -------------------------- # Messages from OSPF daemon. # -------------------------- @@ -842,7 +845,7 @@ class OspfOpaqueClient(OspfApiClient): await self._assure_opaque_ready(lsa_type, otype) await self.msg_send_raises(mt, msg) - async def delete_opaque_data(self, addr, lsa_type, otype, oid): + async def delete_opaque_data(self, addr, lsa_type, otype, oid, flags=0): """Delete an instance of opaque data. Delete an instance of opaque data. This call will register for the given @@ -854,6 +857,7 @@ class OspfOpaqueClient(OspfApiClient): otype: (octet) opaque type. Note: the type will be registered if the user has not explicity done that yet with `register_opaque_data`. oid: (3 octets) ID of this opaque data + flags: (octet) optional flags (e.g., OSPF_API_DEL_ZERO_LEN_LSA, defaults to no flags) Raises: See `msg_send_raises` """ @@ -862,7 +866,7 @@ class OspfOpaqueClient(OspfApiClient): mt = MSG_DELETE_REQUEST await self._assure_opaque_ready(lsa_type, otype) - mp = struct.pack(msg_fmt[mt], int(addr), lsa_type, otype, oid) + mp = struct.pack(msg_fmt[mt], int(addr), lsa_type, otype, flags, oid) await self.msg_send_raises(mt, mp) async def register_opaque_data(self, lsa_type, otype, callback=None): @@ -1115,23 +1119,28 @@ async def async_main(args): except ValueError: addr = ip(aval) oargs = [addr, ltype, int(_s.pop(False)), int(_s.pop(False))] - assert len(_s) <= 1, "Bad format for action argument" - try: - b = bytes.fromhex(_s.pop(False)) - except IndexError: - b = b"" - logging.info("opaque data is %s octets", len(b)) - # Needs to be multiple of 4 in length - mod = len(b) % 4 - if mod: - b += b"\x00" * (4 - mod) - logging.info("opaque padding to %s octets", len(b)) - if what.casefold() == "add": + try: + b = bytes.fromhex(_s.pop(False)) + except IndexError: + b = b"" + logging.info("opaque data is %s octets", len(b)) + # Needs to be multiple of 4 in length + mod = len(b) % 4 + if mod: + b += b"\x00" * (4 - mod) + logging.info("opaque padding to %s octets", len(b)) + await c.add_opaque_data(*oargs, b) else: assert what.casefold().startswith("del") - await c.delete_opaque_data(*oargs) + f = 0 + if len(_s) >= 1: + try: + f = int(_s.pop(False)) + except IndexError: + f = 0 + await c.delete_opaque_data(*oargs, f) if args.exit: return 0 except Exception as error: @@ -1153,7 +1162,9 @@ def main(*args): ap.add_argument("--server", default="localhost", help="OSPF API server") ap.add_argument("-v", "--verbose", action="store_true", help="be verbose") ap.add_argument( - "actions", nargs="*", help="(ADD|DEL),LSATYPE,[ADDR,],OTYPE,OID,[HEXDATA]" + "actions", + nargs="*", + help="(ADD|DEL),LSATYPE,[ADDR,],OTYPE,OID,[HEXDATA|DEL_FLAG]", ) args = ap.parse_args() |