]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_msdp.h
pim6d: fix "show ipv6 mld interface" command
[mirror_frr.git] / pimd / pim_msdp.h
index bb7ee01ad819a1a0fb0d33c3f3f8833fee3b2e4f..4e1114aff2870d064dbca5183203e84ee6760cea 100644 (file)
@@ -78,7 +78,7 @@ enum pim_msdp_sa_flags {
 struct pim_msdp_sa {
        struct pim_instance *pim;
 
-       struct prefix_sg sg;
+       pim_sgaddr sg;
        char sg_str[PIM_SG_LEN];
        struct in_addr rp;   /* Last RP address associated with this SA */
        struct in_addr peer; /* last peer from who we heard this SA */
@@ -97,7 +97,9 @@ enum pim_msdp_peer_flags {
        PIM_MSDP_PEERF_NONE = 0,
        PIM_MSDP_PEERF_LISTENER = (1 << 0),
 #define PIM_MSDP_PEER_IS_LISTENER(mp) (mp->flags & PIM_MSDP_PEERF_LISTENER)
-       PIM_MSDP_PEERF_SA_JUST_SENT = (1 << 1)
+       PIM_MSDP_PEERF_SA_JUST_SENT = (1 << 1),
+       /** Flag to signalize that peer belongs to a group. */
+       PIM_MSDP_PEERF_IN_GROUP = (1 << 2),
 };
 
 struct pim_msdp_peer {
@@ -205,6 +207,13 @@ struct pim_msdp {
 
        /** List of mesh groups. */
        struct pim_mesh_group_list mglist;
+
+       /** MSDP global hold time period. */
+       uint32_t hold_time;
+       /** MSDP global keep alive period. */
+       uint32_t keep_alive;
+       /** MSDP global connection retry period. */
+       uint32_t connection_retry;
 };
 
 #define PIM_MSDP_PEER_READ_ON(mp)                                              \
@@ -218,16 +227,11 @@ struct pim_msdp {
 #define PIM_MSDP_PEER_READ_OFF(mp) thread_cancel(&mp->t_read)
 #define PIM_MSDP_PEER_WRITE_OFF(mp) thread_cancel(&mp->t_write)
 
+#if PIM_IPV != 6
 // struct pim_msdp *msdp;
 struct pim_instance;
 void pim_msdp_init(struct pim_instance *pim, struct thread_master *master);
 void pim_msdp_exit(struct pim_instance *pim);
-enum pim_msdp_err pim_msdp_peer_add(struct pim_instance *pim,
-                                   struct in_addr peer, struct in_addr local,
-                                   const char *mesh_group_name,
-                                   struct pim_msdp_peer **mp_p);
-enum pim_msdp_err pim_msdp_peer_del(struct pim_instance *pim,
-                                   struct in_addr peer_addr);
 char *pim_msdp_state_dump(enum pim_msdp_peer_state state, char *buf,
                          int buf_size);
 struct pim_msdp_peer *pim_msdp_peer_find(struct pim_instance *pim,
@@ -236,23 +240,21 @@ void pim_msdp_peer_established(struct pim_msdp_peer *mp);
 void pim_msdp_peer_pkt_rxed(struct pim_msdp_peer *mp);
 void pim_msdp_peer_stop_tcp_conn(struct pim_msdp_peer *mp, bool chg_state);
 void pim_msdp_peer_reset_tcp_conn(struct pim_msdp_peer *mp, const char *rc_str);
-int pim_msdp_write(struct thread *thread);
-char *pim_msdp_peer_key_dump(struct pim_msdp_peer *mp, char *buf, int buf_size,
-                            bool long_format);
+void pim_msdp_write(struct thread *thread);
 int pim_msdp_config_write(struct pim_instance *pim, struct vty *vty,
                          const char *spaces);
 bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim,
                                const char *spaces);
 void pim_msdp_peer_pkt_txed(struct pim_msdp_peer *mp);
 void pim_msdp_sa_ref(struct pim_instance *pim, struct pim_msdp_peer *mp,
-                    struct prefix_sg *sg, struct in_addr rp);
+                    pim_sgaddr *sg, struct in_addr rp);
 void pim_msdp_sa_local_update(struct pim_upstream *up);
-void pim_msdp_sa_local_del(struct pim_instance *pim, struct prefix_sg *sg);
+void pim_msdp_sa_local_del(struct pim_instance *pim, pim_sgaddr *sg);
 void pim_msdp_i_am_rp_changed(struct pim_instance *pim);
 bool pim_msdp_peer_rpf_check(struct pim_msdp_peer *mp, struct in_addr rp);
 void pim_msdp_up_join_state_changed(struct pim_instance *pim,
                                    struct pim_upstream *xg_up);
-void pim_msdp_up_del(struct pim_instance *pim, struct prefix_sg *sg);
+void pim_msdp_up_del(struct pim_instance *pim, pim_sgaddr *sg);
 enum pim_msdp_err pim_msdp_mg_del(struct pim_instance *pim,
                                  const char *mesh_group_name);
 
@@ -288,4 +290,79 @@ struct pim_msdp_mg_mbr *pim_msdp_mg_mbr_add(struct pim_instance *pim,
  */
 void pim_msdp_mg_mbr_del(struct pim_msdp_mg *mg, struct pim_msdp_mg_mbr *mbr);
 
+/**
+ * Allocates MSDP peer data structure, adds peer to group name
+ * `mesh_group_name` and starts state machine. If no group name is provided then
+ * the peer will work standalone.
+ *
+ * \param pim PIM instance
+ * \param peer_addr peer address
+ * \param local_addr local listening address
+ * \param mesh_group_name mesh group name (or `NULL` for peers without group).
+ */
+struct pim_msdp_peer *pim_msdp_peer_add(struct pim_instance *pim,
+                                       const struct in_addr *peer_addr,
+                                       const struct in_addr *local_addr,
+                                       const char *mesh_group_name);
+
+/**
+ * Stops peer state machine and free memory.
+ */
+void pim_msdp_peer_del(struct pim_msdp_peer **mp);
+
+/**
+ * Changes peer source address.
+ *
+ * NOTE:
+ * This will cause the connection to drop and start again.
+ */
+void pim_msdp_peer_change_source(struct pim_msdp_peer *mp,
+                                const struct in_addr *addr);
+
+#else /* PIM_IPV == 6 */
+static inline void pim_msdp_init(struct pim_instance *pim,
+                                struct thread_master *master)
+{
+}
+
+static inline void pim_msdp_exit(struct pim_instance *pim)
+{
+}
+
+static inline void pim_msdp_i_am_rp_changed(struct pim_instance *pim)
+{
+}
+
+static inline void pim_msdp_up_join_state_changed(struct pim_instance *pim,
+                                                 struct pim_upstream *xg_up)
+{
+}
+
+static inline void pim_msdp_up_del(struct pim_instance *pim, pim_sgaddr *sg)
+{
+}
+
+static inline void pim_msdp_sa_local_update(struct pim_upstream *up)
+{
+}
+
+static inline void pim_msdp_sa_local_del(struct pim_instance *pim,
+                                        pim_sgaddr *sg)
+{
+}
+
+static inline int pim_msdp_config_write(struct pim_instance *pim,
+                                       struct vty *vty, const char *spaces)
+{
+       return 0;
+}
+
+static inline bool pim_msdp_peer_config_write(struct vty *vty,
+                                             struct pim_instance *pim,
+                                             const char *spaces)
+{
+       return false;
+}
+#endif /* PIM_IPV == 6 */
+
 #endif