mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 04:01:59 +00:00
ospfd: add router id support to ospf api
Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
2d088d8d53
commit
44038c7ae3
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* API message handling module for OSPF daemon and client.
|
||||
* Copyright (C) 2001, 2002 Ralph Keller
|
||||
* Copyright (c) 2022, LabN Consulting, L.L.C.
|
||||
*
|
||||
* This file is part of GNU Zebra.
|
||||
*
|
||||
@ -682,4 +683,12 @@ struct msg *new_msg_reachable_change(uint32_t seqnum, uint16_t nadd,
|
||||
return msg_new(MSG_REACHABLE_CHANGE, nmsg, seqnum, len);
|
||||
}
|
||||
|
||||
struct msg *new_msg_router_id_change(uint32_t seqnum, struct in_addr router_id)
|
||||
{
|
||||
struct msg_router_id_change rmsg = {.router_id = router_id};
|
||||
|
||||
return msg_new(MSG_ROUTER_ID_CHANGE, &rmsg, seqnum,
|
||||
sizeof(struct msg_router_id_change));
|
||||
}
|
||||
|
||||
#endif /* SUPPORT_OSPF_API */
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* API message handling module for OSPF daemon and client.
|
||||
* Copyright (C) 2001, 2002 Ralph Keller
|
||||
* Copyright (c) 2022, LabN Consulting, L.L.C.
|
||||
*
|
||||
* This file is part of GNU Zebra.
|
||||
*
|
||||
@ -118,6 +119,7 @@ extern void msg_fifo_free(struct msg_fifo *fifo);
|
||||
#define MSG_SYNC_REACHABLE 7
|
||||
#define MSG_SYNC_ISM 8
|
||||
#define MSG_SYNC_NSM 9
|
||||
#define MSG_SYNC_ROUTER_ID 19
|
||||
|
||||
/* Messages from OSPF daemon. */
|
||||
#define MSG_REPLY 10
|
||||
@ -129,6 +131,7 @@ extern void msg_fifo_free(struct msg_fifo *fifo);
|
||||
#define MSG_ISM_CHANGE 16
|
||||
#define MSG_NSM_CHANGE 17
|
||||
#define MSG_REACHABLE_CHANGE 18
|
||||
#define MSG_ROUTER_ID_CHANGE 20
|
||||
|
||||
struct msg_register_opaque_type {
|
||||
uint8_t lsatype;
|
||||
@ -260,6 +263,10 @@ struct msg_reachable_change {
|
||||
struct in_addr router_ids[]; /* add followed by remove */
|
||||
};
|
||||
|
||||
struct msg_router_id_change {
|
||||
struct in_addr router_id; /* this systems router id */
|
||||
};
|
||||
|
||||
/* We make use of a union to define a structure that covers all
|
||||
possible API messages. This allows us to find out how much memory
|
||||
needs to be reserved for the largest API message. */
|
||||
@ -279,6 +286,7 @@ struct apimsg {
|
||||
struct msg_nsm_change nsm_change;
|
||||
struct msg_lsa_change_notify lsa_change_notify;
|
||||
struct msg_reachable_change reachable_change;
|
||||
struct msg_router_id_change router_id_change;
|
||||
} u;
|
||||
};
|
||||
|
||||
@ -338,6 +346,9 @@ extern struct msg *new_msg_reachable_change(uint32_t seqnum, uint16_t nadd,
|
||||
struct in_addr *add,
|
||||
uint16_t nremove,
|
||||
struct in_addr *remove);
|
||||
|
||||
extern struct msg *new_msg_router_id_change(uint32_t seqnr,
|
||||
struct in_addr router_id);
|
||||
/* string printing functions */
|
||||
extern const char *ospf_api_errname(int errcode);
|
||||
extern const char *ospf_api_typename(int msgtype);
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Server side of OSPF API.
|
||||
* Copyright (C) 2001, 2002 Ralph Keller
|
||||
* Copyright (c) 2022, LabN Consulting, L.L.C.
|
||||
*
|
||||
* This file is part of GNU Zebra.
|
||||
*
|
||||
@ -727,6 +728,7 @@ static int ospf_apiserver_send_msg(struct ospf_apiserver *apiserv,
|
||||
case MSG_ISM_CHANGE:
|
||||
case MSG_NSM_CHANGE:
|
||||
case MSG_REACHABLE_CHANGE:
|
||||
case MSG_ROUTER_ID_CHANGE:
|
||||
fifo = apiserv->out_async_fifo;
|
||||
fd = apiserv->fd_async;
|
||||
event = OSPF_APISERVER_ASYNC_WRITE;
|
||||
@ -809,6 +811,9 @@ int ospf_apiserver_handle_msg(struct ospf_apiserver *apiserv, struct msg *msg)
|
||||
case MSG_SYNC_NSM:
|
||||
rc = ospf_apiserver_handle_sync_nsm(apiserv, msg);
|
||||
break;
|
||||
case MSG_SYNC_ROUTER_ID:
|
||||
rc = ospf_apiserver_handle_sync_router_id(apiserv, msg);
|
||||
break;
|
||||
default:
|
||||
zlog_warn("ospf_apiserver_handle_msg: Unknown message type: %d",
|
||||
msg->hdr.msgtype);
|
||||
@ -1479,6 +1484,23 @@ int ospf_apiserver_handle_sync_nsm(struct ospf_apiserver *apiserv,
|
||||
}
|
||||
|
||||
|
||||
int ospf_apiserver_handle_sync_router_id(struct ospf_apiserver *apiserv,
|
||||
struct msg *msg)
|
||||
{
|
||||
struct ospf *ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
||||
uint32_t seqnum = msg_get_seq(msg);
|
||||
struct msg *m;
|
||||
int _rc, rc = 0;
|
||||
|
||||
m = new_msg_router_id_change(seqnum, ospf->router_id);
|
||||
rc = ospf_apiserver_send_msg(apiserv, m);
|
||||
msg_free(m);
|
||||
|
||||
/* Send a reply back to client with return code */
|
||||
_rc = ospf_apiserver_send_reply(apiserv, seqnum, rc);
|
||||
return rc ? rc : _rc;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------
|
||||
* Following are functions to originate or update LSA
|
||||
* from an application.
|
||||
@ -2679,4 +2701,19 @@ void ospf_apiserver_notify_reachable(struct route_table *ort,
|
||||
}
|
||||
|
||||
|
||||
void ospf_apiserver_clients_notify_router_id_change(struct in_addr router_id)
|
||||
{
|
||||
struct msg *msg;
|
||||
|
||||
msg = new_msg_router_id_change(0, router_id);
|
||||
if (!msg) {
|
||||
zlog_warn("%s: new_msg_router_id_change failed", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
ospf_apiserver_clients_notify_all(msg);
|
||||
msg_free(msg);
|
||||
}
|
||||
|
||||
|
||||
#endif /* SUPPORT_OSPF_API */
|
||||
|
@ -125,6 +125,8 @@ extern void ospf_apiserver_clients_notify_new_if(struct ospf_interface *oi);
|
||||
extern void ospf_apiserver_clients_notify_del_if(struct ospf_interface *oi);
|
||||
extern void ospf_apiserver_clients_notify_ism_change(struct ospf_interface *oi);
|
||||
extern void ospf_apiserver_clients_notify_nsm_change(struct ospf_neighbor *nbr);
|
||||
extern void
|
||||
ospf_apiserver_clients_notify_router_id_change(struct in_addr router_id);
|
||||
|
||||
extern int ospf_apiserver_is_ready_type9(struct ospf_interface *oi);
|
||||
extern int ospf_apiserver_is_ready_type10(struct ospf_area *area);
|
||||
@ -157,6 +159,8 @@ extern int ospf_apiserver_handle_sync_ism(struct ospf_apiserver *apiserv,
|
||||
struct msg *msg);
|
||||
extern int ospf_apiserver_handle_sync_nsm(struct ospf_apiserver *apiserv,
|
||||
struct msg *msg);
|
||||
extern int ospf_apiserver_handle_sync_router_id(struct ospf_apiserver *apiserv,
|
||||
struct msg *msg);
|
||||
|
||||
extern void ospf_apiserver_notify_reachable(struct route_table *ort,
|
||||
struct route_table *nrt);
|
||||
|
@ -61,6 +61,7 @@
|
||||
#include "ospfd/ospf_ase.h"
|
||||
#include "ospfd/ospf_ldp_sync.h"
|
||||
#include "ospfd/ospf_gr.h"
|
||||
#include "ospfd/ospf_apiserver.h"
|
||||
|
||||
|
||||
DEFINE_QOBJ_TYPE(ospf);
|
||||
@ -241,6 +242,10 @@ void ospf_process_refresh_data(struct ospf *ospf, bool reset)
|
||||
}
|
||||
|
||||
ospf_external_lsa_rid_change(ospf);
|
||||
|
||||
#ifdef SUPPORT_OSPF_API
|
||||
ospf_apiserver_clients_notify_router_id_change(router_id);
|
||||
#endif
|
||||
}
|
||||
|
||||
ospf->inst_shutdown = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user