pimd: Implement autorp mapping agent

Fully flushed out the AutoRP implementation now with the AutoRP mapping agent.
This touched most of AutoRP in order to have common reuse of containers for each
section of AutoRP operation (Candidate RP announcement, Mapping agent, Discovery).
Many debugs had guards added and many more debug logs added.

Signed-off-by: Nathan Bahr <nbahr@atcorp.com>
This commit is contained in:
Nathan Bahr 2024-11-01 19:14:47 +00:00
parent a060c72530
commit b6aa71b59b
3 changed files with 1220 additions and 422 deletions

File diff suppressed because it is too large Load diff

View file

@ -14,16 +14,21 @@
#define AUTORP_VERSION 1
#define AUTORP_ANNOUNCEMENT_TYPE 1
#define AUTORP_DISCOVERY_TYPE 2
#define PIM_VUNKNOWN 0
#define PIM_V1 1
#define PIM_V2 2
#define PIM_V1_2 3
#define AUTORP_PIM_VUNKNOWN 0
#define AUTORP_PIM_V1 1
#define AUTORP_PIM_V2 2
#define AUTORP_PIM_V1_2 3
#define DEFAULT_ANNOUNCE_INTERVAL 60
#define DEFAULT_ANNOUNCE_SCOPE 31
#define DEFAULT_ANNOUNCE_HOLDTIME -1
#define DEFAULT_AUTORP_ANNOUNCE_INTERVAL 60
#define DEFAULT_AUTORP_ANNOUNCE_SCOPE 31
#define DEFAULT_AUTORP_ANNOUNCE_HOLDTIME -1
#define DEFAULT_AUTORP_DISCOVERY_INTERVAL 60
#define DEFAULT_AUTORP_DISCOVERY_SCOPE 31
#define DEFAULT_AUTORP_DISCOVERY_HOLDTIME 180
PREDECL_SORTLIST_UNIQ(pim_autorp_rp);
PREDECL_SORTLIST_UNIQ(pim_autorp_grppfix);
struct autorp_pkt_grp {
#if __BYTE_ORDER == __LITTLE_ENDIAN
@ -79,7 +84,15 @@ struct pim_autorp_rp {
struct event *hold_timer;
struct prefix grp;
char grplist[32];
struct pim_autorp_rp_item list;
struct pim_autorp_grppfix_head grp_pfix_list;
struct pim_autorp_rp_item item;
};
struct pim_autorp_grppfix {
struct prefix grp;
struct in_addr rp;
bool negative;
struct pim_autorp_grppfix_item item;
};
struct pim_autorp {
@ -96,13 +109,18 @@ struct pim_autorp {
struct event *announce_timer;
/* Event for sending discovery packets*/
/* struct event *discovery_timer; */
struct event *send_discovery_timer;
/* Flag enabling reading discovery packets */
bool do_discovery;
/* Flag enabling mapping agent (reading announcements and sending discovery)*/
/* bool do_mapping; */
bool send_rp_discovery;
/* Flag indicating if we are sending discovery messages (true) or if a higher IP mapping
* agent preemptied our sending (false)
*/
bool mapping_agent_active;
/* List of RP's in received discovery packets */
struct pim_autorp_rp_head discovery_rp_list;
@ -111,7 +129,12 @@ struct pim_autorp {
struct pim_autorp_rp_head candidate_rp_list;
/* List of announced RP's to send in discovery packets */
/* struct pim_autorp_rp_head mapping_rp_list; */
struct pim_autorp_rp_head mapping_rp_list;
/* List of the last advertised RP's, via mapping agent discovery
* This is only filled if a discovery message was sent
*/
struct pim_autorp_rp_head advertised_rp_list;
/* Packet parameters for sending announcement packets */
uint8_t announce_scope;
@ -119,32 +142,32 @@ struct pim_autorp {
int32_t announce_holdtime;
/* Pre-built announcement packet, only changes when configured RP's or packet parameters change */
uint8_t *annouce_pkt;
uint16_t annouce_pkt_sz;
uint8_t *announce_pkt;
uint16_t announce_pkt_sz;
/* TODO: Packet parameters for sending discovery packets
* int discovery_scope;
* int discovery_interval;
* int discovery_holdtime;
*/
/* Packet parameters for sending discovery packets */
uint8_t discovery_scope;
uint16_t discovery_interval;
uint16_t discovery_holdtime;
struct cand_addrsel mapping_agent_addrsel;
};
#define AUTORP_GRPLEN 6
#define AUTORP_RPLEN 6
#define AUTORP_HDRLEN 8
void pim_autorp_prefix_list_update(struct pim_instance *pim, struct prefix_list *plist);
bool pim_autorp_rm_candidate_rp(struct pim_instance *pim, pim_addr rpaddr);
void pim_autorp_add_candidate_rp_group(struct pim_instance *pim,
pim_addr rpaddr, struct prefix group);
void pim_autorp_add_candidate_rp_group(struct pim_instance *pim, pim_addr rpaddr,
struct prefix group);
bool pim_autorp_rm_candidate_rp_group(struct pim_instance *pim, pim_addr rpaddr,
struct prefix group);
void pim_autorp_add_candidate_rp_plist(struct pim_instance *pim,
pim_addr rpaddr, const char *plist);
bool pim_autorp_rm_candidate_rp_plist(struct pim_instance *pim, pim_addr rpaddr,
const char *plist);
void pim_autorp_add_candidate_rp_plist(struct pim_instance *pim, pim_addr rpaddr, const char *plist);
bool pim_autorp_rm_candidate_rp_plist(struct pim_instance *pim, pim_addr rpaddr, const char *plist);
void pim_autorp_announce_scope(struct pim_instance *pim, uint8_t scope);
void pim_autorp_announce_interval(struct pim_instance *pim, uint16_t interval);
void pim_autorp_announce_holdtime(struct pim_instance *pim, int32_t holdtime);
void pim_autorp_send_discovery_apply(struct pim_autorp *autorp);
void pim_autorp_add_ifp(struct interface *ifp);
void pim_autorp_rm_ifp(struct interface *ifp);
void pim_autorp_start_discovery(struct pim_instance *pim);
@ -152,7 +175,7 @@ void pim_autorp_stop_discovery(struct pim_instance *pim);
void pim_autorp_init(struct pim_instance *pim);
void pim_autorp_finish(struct pim_instance *pim);
int pim_autorp_config_write(struct pim_instance *pim, struct vty *vty);
void pim_autorp_show_autorp(struct vty *vty, struct pim_instance *pim,
void pim_autorp_show_autorp(struct vty *vty, struct pim_instance *pim, const char *component,
json_object *json);
#endif

View file

@ -35,6 +35,7 @@
#include "pim_zlookup.h"
#include "pim_zebra.h"
#include "pim_mlag.h"
#include "pim_autorp.h"
#if MAXVIFS > 256
CPP_NOTICE("Work needs to be done to make this work properly via the pim mroute socket\n");
@ -70,6 +71,9 @@ void pim_prefix_list_update(struct prefix_list *plist)
pim_rp_prefix_list_update(pim, plist);
pim_ssm_prefix_list_update(pim, plist);
pim_upstream_spt_prefix_list_update(pim, plist);
#if PIM_IPV == 4
pim_autorp_prefix_list_update(pim, plist);
#endif
}
}