summaryrefslogtreecommitdiffstats
path: root/ospfclient
diff options
context:
space:
mode:
authorLou Berger <lberger@labn.net>2022-10-16 17:19:37 +0200
committerLou Berger <lberger@labn.net>2022-10-21 17:27:58 +0200
commit2f30cb25747dc9657046c59ca1f378203192de26 (patch)
treee064c47134e510a7544f9990a92692e5e657fe4e /ospfclient
parentospfd: ospf_apiserver.c - fix link local opaque LSA delete (diff)
downloadfrr-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.c5
-rw-r--r--ospfclient/ospf_apiclient.h3
-rw-r--r--ospfclient/ospfclient.c7
-rwxr-xr-xospfclient/ospfclient.py45
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()