mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-29 06:29:40 +00:00
pimd: Start work for handling of register command
Start the coding of the REGISTER receive and send. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
7bfa617548
commit
01d68c9bea
@ -54,7 +54,7 @@ libpim_a_SOURCES = \
|
|||||||
pim_hello.c pim_ifchannel.c pim_join.c pim_assert.c \
|
pim_hello.c pim_ifchannel.c pim_join.c pim_assert.c \
|
||||||
pim_msg.c pim_upstream.c pim_rpf.c pim_macro.c \
|
pim_msg.c pim_upstream.c pim_rpf.c pim_macro.c \
|
||||||
pim_igmp_join.c pim_ssmpingd.c pim_int.c pim_rp.c \
|
pim_igmp_join.c pim_ssmpingd.c pim_int.c pim_rp.c \
|
||||||
pim_static.c pim_br.c
|
pim_static.c pim_br.c pim_register.c
|
||||||
|
|
||||||
noinst_HEADERS = \
|
noinst_HEADERS = \
|
||||||
pimd.h pim_version.h pim_cmd.h pim_signals.h pim_iface.h \
|
pimd.h pim_version.h pim_cmd.h pim_signals.h pim_iface.h \
|
||||||
@ -64,7 +64,7 @@ noinst_HEADERS = \
|
|||||||
pim_hello.h pim_ifchannel.h pim_join.h pim_assert.h \
|
pim_hello.h pim_ifchannel.h pim_join.h pim_assert.h \
|
||||||
pim_msg.h pim_upstream.h pim_rpf.h pim_macro.h \
|
pim_msg.h pim_upstream.h pim_rpf.h pim_macro.h \
|
||||||
pim_igmp_join.h pim_ssmpingd.h pim_int.h pim_rp.h \
|
pim_igmp_join.h pim_ssmpingd.h pim_int.h pim_rp.h \
|
||||||
pim_static.h pim_br.h
|
pim_static.h pim_br.h pim_register.h
|
||||||
|
|
||||||
pimd_SOURCES = \
|
pimd_SOURCES = \
|
||||||
pim_main.c $(libpim_a_SOURCES)
|
pim_main.c $(libpim_a_SOURCES)
|
||||||
|
188
pimd/pim_register.c
Normal file
188
pimd/pim_register.c
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
/*
|
||||||
|
* PIM for Quagga
|
||||||
|
* Copyright (C) 2015 Cumulus Networks, Inc.
|
||||||
|
* Donald Sharp
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zebra.h>
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "if.h"
|
||||||
|
#include "thread.h"
|
||||||
|
|
||||||
|
#include "pimd.h"
|
||||||
|
#include "pim_str.h"
|
||||||
|
#include "pim_rp.h"
|
||||||
|
#include "pim_register.h"
|
||||||
|
#include "pim_br.h"
|
||||||
|
|
||||||
|
struct thread *send_test_packet_timer = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This seems stupidly expensive. A list lookup. Why is this
|
||||||
|
* not a hash?
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
pim_check_is_my_ip_address (struct in_addr dest_addr)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* See if we can short-cut some?
|
||||||
|
* This might not make sense if we ever leave a static RP
|
||||||
|
* type of configuration.
|
||||||
|
* Note - Premature optimization might bite our patooeys' here.
|
||||||
|
*/
|
||||||
|
if (I_am_RP(dest_addr) && (dest_addr.s_addr == qpim_rp.s_addr))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (if_lookup_exact_address (&dest_addr, AF_INET))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pim_register_stop_send (struct in_addr src)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 4.4.2 Receiving Register Messages at the RP
|
||||||
|
*
|
||||||
|
* When an RP receives a Register message, the course of action is
|
||||||
|
* decided according to the following pseudocode:
|
||||||
|
*
|
||||||
|
* packet_arrives_on_rp_tunnel( pkt ) {
|
||||||
|
* if( outer.dst is not one of my addresses ) {
|
||||||
|
* drop the packet silently.
|
||||||
|
* # Note: this may be a spoofing attempt
|
||||||
|
* }
|
||||||
|
* if( I_am_RP(G) AND outer.dst == RP(G) ) {
|
||||||
|
* sentRegisterStop = FALSE;
|
||||||
|
* if ( register.borderbit == TRUE ) {
|
||||||
|
* if ( PMBR(S,G) == unknown ) {
|
||||||
|
* PMBR(S,G) = outer.src
|
||||||
|
* } else if ( outer.src != PMBR(S,G) ) {
|
||||||
|
* send Register-Stop(S,G) to outer.src
|
||||||
|
* drop the packet silently.
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* if ( SPTbit(S,G) OR
|
||||||
|
* ( SwitchToSptDesired(S,G) AND
|
||||||
|
* ( inherited_olist(S,G) == NULL ))) {
|
||||||
|
* send Register-Stop(S,G) to outer.src
|
||||||
|
* sentRegisterStop = TRUE;
|
||||||
|
* }
|
||||||
|
* if ( SPTbit(S,G) OR SwitchToSptDesired(S,G) ) {
|
||||||
|
* if ( sentRegisterStop == TRUE ) {
|
||||||
|
* set KeepaliveTimer(S,G) to RP_Keepalive_Period;
|
||||||
|
* } else {
|
||||||
|
* set KeepaliveTimer(S,G) to Keepalive_Period;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* if( !SPTbit(S,G) AND ! pkt.NullRegisterBit ) {
|
||||||
|
* decapsulate and forward the inner packet to
|
||||||
|
* inherited_olist(S,G,rpt) # Note (+)
|
||||||
|
* }
|
||||||
|
* } else {
|
||||||
|
* send Register-Stop(S,G) to outer.src
|
||||||
|
* # Note (*)
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
pim_register_recv (struct interface *ifp,
|
||||||
|
struct in_addr dest_addr,
|
||||||
|
struct in_addr src_addr,
|
||||||
|
uint8_t *tlv_buf, int tlv_buf_size)
|
||||||
|
{
|
||||||
|
//int sentRegisterStop = 0;
|
||||||
|
struct in_addr group = { .s_addr = 0 };
|
||||||
|
struct in_addr source = { .s_addr = 0 };
|
||||||
|
struct in_addr outer_src = { .s_addr = 0 };
|
||||||
|
uint32_t *bits = (uint32_t *)tlv_buf;
|
||||||
|
//uint8_t *data = (tlv_buf + sizeof(uint32_t));
|
||||||
|
uint32_t nrb;
|
||||||
|
|
||||||
|
if (!pim_check_is_my_ip_address (dest_addr)) {
|
||||||
|
if (PIM_DEBUG_PIM_PACKETS) {
|
||||||
|
char dest[100];
|
||||||
|
|
||||||
|
pim_inet4_dump ("<dst?>", dest_addr, dest, sizeof(dest));
|
||||||
|
zlog_debug ("%s: Received Register message for %s that I do not own", __func__,
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nrb = (*bits && PIM_REGISTER_NR_BIT);
|
||||||
|
if (I_am_RP (group) && (dest_addr.s_addr == (RP (group).s_addr))) {
|
||||||
|
//sentRegisterStop = 0;
|
||||||
|
|
||||||
|
if (*bits && PIM_REGISTER_BORDER_BIT) {
|
||||||
|
struct in_addr pimbr = pim_br_get_pmbr (source, group);
|
||||||
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
|
zlog_debug("%s: Received Register message with Border bit set", __func__);
|
||||||
|
|
||||||
|
if (pimbr.s_addr == pim_br_unknown.s_addr)
|
||||||
|
pim_br_set_pmbr(source, group, outer_src);
|
||||||
|
else if (outer_src.s_addr != pimbr.s_addr) {
|
||||||
|
pim_register_stop_send(outer_src);
|
||||||
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
|
zlog_debug("%s: Sending register-Stop to %s and dropping mr. packet",
|
||||||
|
__func__, "Sender");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nrb++;
|
||||||
|
//pim_recv_
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
pim_register_send_test_packet (struct thread *t)
|
||||||
|
{
|
||||||
|
uint8_t *packet;
|
||||||
|
|
||||||
|
packet = THREAD_ARG(t);
|
||||||
|
|
||||||
|
*packet = 4;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* pim_register_send_test_packet
|
||||||
|
*
|
||||||
|
* Send a test packet to the RP from source, in group and pps packets per second
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
pim_register_send_test_packet_start (struct in_addr source,
|
||||||
|
struct in_addr group,
|
||||||
|
uint32_t pps)
|
||||||
|
{
|
||||||
|
uint8_t *packet = NULL;
|
||||||
|
|
||||||
|
THREAD_TIMER_MSEC_ON(master, send_test_packet_timer,
|
||||||
|
pim_register_send_test_packet, packet, 1000/pps);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
40
pimd/pim_register.h
Normal file
40
pimd/pim_register.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* PIM for Quagga
|
||||||
|
* Copyright (C) 2015 Cumulus Networks, Inc.
|
||||||
|
* Donald Sharp
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
#ifndef PIM_REGISTER_H
|
||||||
|
#define PIM_REGISTER_H
|
||||||
|
|
||||||
|
#include <zebra.h>
|
||||||
|
|
||||||
|
#include "if.h"
|
||||||
|
|
||||||
|
#define PIM_REGISTER_BORDER_BIT 0x80000000
|
||||||
|
#define PIM_REGISTER_NR_BIT 0x40000000
|
||||||
|
|
||||||
|
void pim_register_send_test_packet_start (struct in_addr source,
|
||||||
|
struct in_addr group,
|
||||||
|
uint32_t pps);
|
||||||
|
|
||||||
|
int pim_register_recv (struct interface *ifp,
|
||||||
|
struct in_addr dest_addr,
|
||||||
|
struct in_addr src_addr,
|
||||||
|
uint8_t *tlv_buf, int tlv_buf_size);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user