From cc362d24aa2a7a0342134f1d52572189a49f2cbb Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Sat, 12 Mar 2022 22:43:05 +0100 Subject: [PATCH] pim6d: send PIM packets Signed-off-by: David Lamparter --- pimd/pim6_stubs.c | 50 +++++++++++++++------------------------ pimd/pim_pim.c | 60 ++++++++++++++++++++++++++++------------------- pimd/subdir.am | 2 +- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/pimd/pim6_stubs.c b/pimd/pim6_stubs.c index f2781a3ce9..818b137abf 100644 --- a/pimd/pim6_stubs.c +++ b/pimd/pim6_stubs.c @@ -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; +} diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index 82f735465a..1c8e31212e 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -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_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("", 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, diff --git a/pimd/subdir.am b/pimd/subdir.am index 9e61b03c94..ba7bdb3493 100644 --- a/pimd/subdir.am +++ b/pimd/subdir.am @@ -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 \ -- 2.39.5