summaryrefslogtreecommitdiff
path: root/pimd/pim_autorp.h
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_autorp.h')
-rw-r--r--pimd/pim_autorp.h75
1 files changed, 49 insertions, 26 deletions
diff --git a/pimd/pim_autorp.h b/pimd/pim_autorp.h
index a0b029d00a..e4c6530109 100644
--- a/pimd/pim_autorp.h
+++ b/pimd/pim_autorp.h
@@ -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;
-
- /* TODO: Packet parameters for sending discovery packets
- * int discovery_scope;
- * int discovery_interval;
- * int discovery_holdtime;
- */
+ uint8_t *announce_pkt;
+ uint16_t announce_pkt_sz;
+
+ /* 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