]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pim6d: send PIM packets
authorDavid Lamparter <equinox@opensourcerouting.org>
Sat, 12 Mar 2022 21:43:05 +0000 (22:43 +0100)
committerDavid Lamparter <equinox@opensourcerouting.org>
Mon, 28 Mar 2022 12:13:22 +0000 (14:13 +0200)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
pimd/pim6_stubs.c
pimd/pim_pim.c
pimd/subdir.am

index f2781a3ce9d5be4edca3222ad0490512eb650146..818b137abf82cd7c501cb0289fb93b121a9bd5c4 100644 (file)
@@ -53,37 +53,6 @@ void zclient_lookup_free(void)
 {
 }
 
-/*
- * packet handling
- */
-int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
-                int pim_msg_size, const char *ifname)
-{
-       return 0;
-}
-
-int pim_hello_send(struct interface *ifp, uint16_t holdtime)
-{
-       return -1;
-}
-
-void pim_hello_restart_now(struct interface *ifp)
-{
-}
-
-void pim_hello_restart_triggered(struct interface *ifp)
-{
-}
-
-int pim_sock_add(struct interface *ifp)
-{
-       return -1;
-}
-
-void pim_sock_delete(struct interface *ifp, const char *delete_message)
-{
-}
-
 /*
  * PIM register
  */
@@ -121,12 +90,31 @@ struct bsgrp_node *pim_bsm_get_bsgrp_node(struct bsm_scope *scope,
 void pim_bsm_write_config(struct vty *vty, struct interface *ifp)
 {
 }
+
+int pim_bsm_process(struct interface *ifp, pim_sgaddr *sg, uint8_t *buf,
+                   uint32_t buf_size, bool no_fwd)
+{
+       return 0;
+}
+
 void pim_register_send(const uint8_t *buf, int buf_size, pim_addr src,
                       struct pim_rpf *rpg, int null_register,
                       struct pim_upstream *up)
 {
 }
+
 void pim_register_stop_send(struct interface *ifp, pim_sgaddr *sg, pim_addr src,
                            pim_addr originator)
 {
 }
+
+int pim_register_recv(struct interface *ifp, pim_addr dest_addr,
+                     pim_addr src_addr, uint8_t *tlv_buf, int tlv_buf_size)
+{
+       return 0;
+}
+
+int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size)
+{
+       return 0;
+}
index 82f735465a178367bee2875009ad61e70c6d2090..1c8e31212ea66905d8ed460de43493869775638b 100644 (file)
@@ -522,8 +522,9 @@ void pim_sock_reset(struct interface *ifp)
        pim_ifstat_reset(ifp);
 }
 
+#if PIM_IPV == 4
 static uint16_t ip_id = 0;
-
+#endif
 
 static int pim_msg_send_frame(int fd, char *buf, size_t len,
                              struct sockaddr *dst, size_t salen,
@@ -578,19 +579,13 @@ static int pim_msg_send_frame(int fd, char *buf, size_t len,
 int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
                 int pim_msg_size, const char *ifname)
 {
-       struct sockaddr_in to;
        socklen_t tolen;
        unsigned char buffer[10000];
        unsigned char *msg_start;
        uint8_t ttl;
        struct pim_msg_header *header;
-       struct ip *ip;
 
        memset(buffer, 0, 10000);
-       int sendlen = sizeof(struct ip) + pim_msg_size;
-
-       msg_start = buffer + sizeof(struct ip);
-       memcpy(msg_start, pim_msg, pim_msg_size);
 
        header = (struct pim_msg_header *)pim_msg;
 /*
@@ -620,7 +615,11 @@ int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
                break;
        }
 
-       ip = (struct ip *)buffer;
+#if PIM_IPV == 4
+       struct ip *ip = (struct ip *)buffer;
+       struct sockaddr_in to = {};
+       int sendlen = sizeof(*ip) + pim_msg_size;
+
        ip->ip_id = htons(++ip_id);
        ip->ip_hl = 5;
        ip->ip_v = 4;
@@ -631,17 +630,34 @@ int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
        ip->ip_ttl = ttl;
        ip->ip_len = htons(sendlen);
 
-       if (PIM_DEBUG_PIM_PACKETS) {
-               char dst_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<dst?>", dst, dst_str, sizeof(dst_str));
-               zlog_debug("%s: to %s on %s: msg_size=%d checksum=%x", __func__,
-                          dst_str, ifname, pim_msg_size, header->checksum);
-       }
-
-       memset(&to, 0, sizeof(to));
        to.sin_family = AF_INET;
        to.sin_addr = dst;
        tolen = sizeof(to);
+#else
+       struct ip6_hdr *ip = (struct ip6_hdr *)buffer;
+       struct sockaddr_in6 to = {};
+       int sendlen = sizeof(*ip) + pim_msg_size;
+
+       ip->ip6_flow = 0;
+       ip->ip6_vfc = (6 << 4) | (IPTOS_PREC_INTERNETCONTROL >> 4);
+       ip->ip6_plen = htons(pim_msg_size);
+       ip->ip6_nxt = PIM_IP_PROTO_PIM;
+       ip->ip6_hlim = ttl;
+       ip->ip6_src = src;
+       ip->ip6_dst = dst;
+
+       to.sin6_family = AF_INET6;
+       to.sin6_addr = dst;
+       tolen = sizeof(to);
+#endif
+
+       msg_start = buffer + sizeof(*ip);
+       memcpy(msg_start, pim_msg, pim_msg_size);
+
+       if (PIM_DEBUG_PIM_PACKETS)
+               zlog_debug("%s: to %pPA on %s: msg_size=%d checksum=%x",
+                          __func__, &dst, ifname, pim_msg_size,
+                          header->checksum);
 
        if (PIM_DEBUG_PIM_PACKETDUMP_SEND) {
                pim_pkt_dump(__func__, pim_msg, pim_msg_size);
@@ -661,20 +677,16 @@ static int hello_send(struct interface *ifp, uint16_t holdtime)
 
        pim_ifp = ifp->info;
 
-       if (PIM_DEBUG_PIM_HELLO) {
-               char dst_str[INET_ADDRSTRLEN];
-               pim_inet4_dump("<dst?>", qpim_all_pim_routers_addr, dst_str,
-                              sizeof(dst_str));
+       if (PIM_DEBUG_PIM_HELLO)
                zlog_debug(
-                       "%s: to %s on %s: holdt=%u prop_d=%u overr_i=%u dis_join_supp=%d dr_prio=%u gen_id=%08x addrs=%d",
-                       __func__, dst_str, ifp->name, holdtime,
-                       pim_ifp->pim_propagation_delay_msec,
+                       "%s: to %pPA on %s: holdt=%u prop_d=%u overr_i=%u dis_join_supp=%d dr_prio=%u gen_id=%08x addrs=%d",
+                       __func__, &qpim_all_pim_routers_addr, ifp->name,
+                       holdtime, pim_ifp->pim_propagation_delay_msec,
                        pim_ifp->pim_override_interval_msec,
                        PIM_IF_TEST_PIM_CAN_DISABLE_JOIN_SUPPRESSION(
                                pim_ifp->options),
                        pim_ifp->pim_dr_priority, pim_ifp->pim_generation_id,
                        listcount(ifp->connected));
-       }
 
        pim_tlv_size = pim_hello_build_tlv(
                ifp, pim_msg + PIM_PIM_MIN_LEN,
index 9e61b03c94d85aef0c07944d0b1ce8ef5a7dde98..ba7bdb3493ebdc327aed885bd1cb472c398f7c87 100644 (file)
@@ -39,6 +39,7 @@ pim_common = \
        pimd/pim_neighbor.c \
        pimd/pim_nht.c \
        pimd/pim_oil.c \
+       pimd/pim_pim.c \
        pimd/pim_routemap.c \
        pimd/pim_rp.c \
        pimd/pim_rpf.c \
@@ -72,7 +73,6 @@ pimd_pimd_SOURCES = \
        pimd/pim_msdp.c \
        pimd/pim_msdp_packet.c \
        pimd/pim_msdp_socket.c \
-       pimd/pim_pim.c \
        pimd/pim_register.c \
        pimd/pim_signals.c \
        pimd/pim_zlookup.c \