Commit Graph

1225 Commits

Author SHA1 Message Date
Donald Sharp
a6170d839a
Merge pull request #3863 from patrasar/RP_addition_deletion_changes
Rp addition deletion changes
2019-03-20 18:31:01 -04:00
Jafar Al-Gharaibeh
e272170ef1
Merge pull request #3950 from donaldsharp/zlookup_or_down
pimd: Free up zlookup structure late
2019-03-19 00:10:10 -05:00
Sarita Patra
47e3ce59c4 pimd: Addressing the review comments
Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-03-18 20:22:04 -07:00
Sri Mohana Singamsetty
61be0e35f2
Merge pull request #3949 from qlyoung/remove-zlog-newlines
*: remove trailing newlines from zlog messages
2019-03-15 10:27:54 -07:00
Donald Sharp
f116689efb pimd: Display drpriority as a unsigned int
There existed output code that used %d for a uint32_t
switch to a %u.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-03-15 11:32:41 -04:00
Donald Sharp
aed536d44f pimd: Free up zlookup structure late
When we are shutting down, delay the zlookup free to as
late as possible since we may need it still

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-03-14 17:03:26 -04:00
Quentin Young
9165c5f5ff *: remove trailing newlines from zlog messages
Zlog puts its own newlines on, and doing this makes logs look nasty.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-03-14 18:41:15 +00:00
David Lamparter
6e727402bd
Merge pull request #3907 from donaldsharp/pim_election
pimd: Ensure DR election happens when both sides change prio
2019-03-11 19:41:10 +01:00
David Lamparter
d3b05897ed
Merge pull request #3869 from qlyoung/cocci-fixes
Assorted Coccinelle fixes
2019-03-06 15:54:44 +01:00
Donald Sharp
3de708125e pimd: Ensure DR election happens when both sides change prio
Suppose we have 2 routers A and B.  Both Router A and B have
the same priority of 1000.  Router A is the elected DR.
Now suppose B lowers his priority to 1.  He still looses the
DR election and we are not sending a hello with the new priority.
Immediately after this A's priority is also lowered to 1, it
looses the election and sends the hello.  B receives this hello
and elects A as the DR( since it has the better ip address)
At this point A believes B is the DR, and B believes A is the
DR until such time that the normal hello from B is sent to A,
which if timed correctly can be a significant amount of time).

This code just causes a hello to be sent if the priority is
changed.  Now both sides will be able to converge quickly

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-03-05 10:29:35 -05:00
Quentin Young
81c077d096 pimd: strncpy -> strlcpy
strncpy is a byte copy function not a string copy function

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-02-26 20:50:17 +00:00
Quentin Young
0a22ddfbb1 *: remove null check before XFREE
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-02-25 23:00:46 +00:00
Quentin Young
97b5d752d7 *: use array_size instead of raw division
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-02-25 23:00:16 +00:00
Tim Bray
e3b78da875 *: Rename backet to bucket
Presume typo from original author

Signed-off-by: Tim Bray <tim@kooky.org>
2019-02-25 16:22:36 +00:00
Sarita Patra
246445a372 pimd: Handling delete nexthop track for PIM upstream address
When RP gets deleted, find all the (*, G) upstream whose group belongs to
the deleted RP, release the upstream from pnc->upstream_hash in the function
pim_delete_tracked_nexthop().

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 23:27:16 -08:00
Sarita Patra
8cfd72682e pimd: update pim upstream structure when RP gets deleted
When a RP gets deleted, find all the (*, G) upstream whose
group belongs to the deleted RP.

case 1: if the group belongs to any other rp, then call
pim_upstream_update() to update the upstream addr and rpf
information.

case 2: If no RP found for the group, then clear the pim
upstream address and rpf information.

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 23:27:16 -08:00
Sarita Patra
28309df051 pimd: update pim upstream structure when RP gets configured
When a new RP is configured, find all the (*, G) upstream whose
group belongs to the new RP and then update the upstream structure
with the below fields.
1. De-register for the old RP.
2. Set the upstream address as new RP
3. Register for the new RP.
4. Update the upstream rpf information and kernel multicast forwarding
cache(MFC), if the new RP is reachable.

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 23:27:16 -08:00
Sarita Patra
1250cb5df2 pimd: clear upstream rpf information when RP becomes not reachable
When route to RP gets modified, FRR receives a notification from
zebra, and call the function pim_resolve_upstream_nh() to compute the
nexthop and update upstream->rpf structure.
Issue: In case when RP becomes not reachable, FRR only uninstall
the mroute from the kernal, but not update the upstream->rpf structure.

Fix: When FRR receives a notification from zebra saying RP becomes
not reachable, then update the following fields.
1. update channel_oil incoming interface as MAXVIFS
2. Un-install the mroute from the kernel.
3. Switch upstream state from JOINED to NOTJOINED.
4. Clear the nexthop information of the upstream.

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 23:27:08 -08:00
Sarita Patra
640b8d93ab pimd: clear rp_info source_nexthop when RP becomes not reachable
When route to RP gets modified, FRR receives a notification from
zebra, and call the function pim_update_rp_nh() to compute the
new nexthop and will update the source_nexthop information of
rp_info. This is not working for the case when RP becomes not
reachable.

Fix: When FRR receives a notification from zebra saying RP becomes
not reachable, then delete the source_nexthop informatio of rp_info.

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 21:30:22 -08:00
Sarita Patra
c3156184f9 pimd: Don't install dummy channel oil entry into Kernel
If the channel oil is dummy(channel_oil->is_valid != True),
then don't install entry into the kernel.

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 21:30:22 -08:00
Sarita Patra
732c209c98 pimd: create dummy (*,G) upstream when RP not configured/reachable
In this commit, we are creating a dummy upstream & dummy channel_oil
for (*, G) when RP is not configured or not reachable.
Dummy upstream: <upstream_addr = INADDR_ANY, rpf = Unknown>
Dummy channel oil: <iif = MAXVIFS>

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 21:30:06 -08:00
Sarita Patra
957d93eaf2 pimd: Handling Null incoming interface of dummy upstream
When FRR receives IGMP/PIM (*, G) join and RP is not configured or not
reachable, then we are creating a dummy upstream with incoming interface
as NULL and upstream address as INADDR_ANY.

Added upstream address and incoming interface validation where it is necessary,
before doing any operation on the upstream.

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 21:26:58 -08:00
Sarita Patra
d8bed89dca pimd: Handling dummy upstream in "show ip pim upstream"
When FRR receives IGMP/PIM (*, G) join and RP is not configured or
not reachable, then we are creating a dummy upstream with incoming
interface as NULL.
Added some null checks for the incoming interface, while displaying
the pim upstream information in the cli command "show ip pim upstream".

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 09:38:03 -08:00
Sarita Patra
bbe598df21 pimd: added comments for upstream and channel_oil new values
Added comments which explains the new values for existing fields
and new fields in the upstream and channel_oil data structure.

Following are the summary of the behaviour change in PIM code.

Scenario 1 : RP doesn’t exist/RP not reachable
Event: Join received
Current behaviour:
	No upstream gets created
Changed behaviour:
	Upstream data structure created with below info
	upstream_addr: INADDR_ANY
	channel_oil iif:  MAXVIF
	channel_oil is_valid: FALSE (flag introduced to indicate if this entry is valid to get installed in hardware)
	RPF details: Not valid
	Join state: NOT_JOINED
	Kernal installed: FALSE

Scenario 2: Dummy upstream exists
Event: RP configured
Current Behaviour:
	upstream address updated for the dummy upstream created.
Changed Behaviour:
	upstream_addr: RP address
	channel_oil iif:  MAXVIF
	channel_oil is_valid: FALSE
	RPF details: only RP address updated
	Join state: NOT_JOINED
	Kernel installed: FALSE

Scenario 3: Dummy upstream exists
Event: RP becomes reachable
Current Behaviour:
	Update channel oil, rpf details in the upstream and install in hardware
Changed Behaviour:
	upstream_addr: RP Adress
	channel_oil iif:  MAXVIF
	channel_oil is_valid: FALSE
	RPF details: RPF details updated via NHT callback
	Join state: JOINED
	Kernel installed: TRUE

Scenario 4: MRoute exists
Event: RP gets deleted
Current behaviour:
	Nothing got updated in him upstream and channel oil,
	join timer still runs. Mroute still exists in kernel.
Changed behaviour:
	upstream_addr: INADDR_ANY
	channel_oil iif:  MAXVIF
	channel_oil is_valid: FALSE
	RPF details: Not valid
	Join state: NOT_JOINED (also sent prune towards deleted RPF nbr)
	Kernel installed: FALSE

Scenario 5: MRoute Exists
Event: RP unreachable
Current behaviour:
	Nothing got updated in him upstream and channel oil,
	join timer still runs. Mroute sdeleted from  kernel.
Changed behaviour:
	upstream_addr: RP address
	channel_oil iif:  MAXVIF
	channel_oil is_valid: FALSE
	RPF details: only RP address updated
	Join state: NOT_JOINED (also sent prune towards deleted RPF nbr)
	Kernel installed: FALSE

Scenario 6: Mroute exists
Event: Better RP configured with precise group range & reachable.
Current behaviour:
	No effect on existing route.
Changed behaviour:
	Upstream address: Better RP
	RPF interface: towards the better RP
	Join state: JOINED (Send a prune towards the old RP and send a join
		towards the better RP)

Scenario 7: Mroute exists
Event: RP deleted and another RP with broad group range fits this group & reachable
Current behaviour:
	No effect on current behaviour
Changed behaviour:
	Upstream address: next available RP
	RPF interface: towards the next available RP
	Join state: JOINED (Send a prune towards the old RP and send a join
		towards the better RP)
Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-24 09:38:03 -08:00
Donald Sharp
70fd22bd03 pimd: Add 'test pim keepalive-reset A.B.C.D A.B.C.D' command
Add a test command to pim that allows you to reset the keepalive timer
for an upstream to it's max value.  This is to allow purposeful testing
of cleanup code in pim, by forcing the keeaplive timer to expire later.

robot# show ip pim upstream
Iif       Source          Group           State       Uptime   JoinTimer RSTimer   KATimer   RefCnt
enp3s0    192.168.201.136 225.1.0.0       NotJ,RegP   00:00:10 00:00:52  00:00:25  00:02:54       1
robot# show ip pim upstream
Iif       Source          Group           State       Uptime   JoinTimer RSTimer   KATimer   RefCnt
enp3s0    192.168.201.136 225.1.0.0       NotJ,RegP   00:00:11 00:00:51  00:00:24  00:02:53       1
robot# test pim keep 192.168.201.136 225.1.0.0
Setting (192.168.201.136,225.1.0.0) to current keep alive time: 210
robot# show ip pim upstream
Iif       Source          Group           State       Uptime   JoinTimer RSTimer   KATimer   RefCnt
enp3s0    192.168.201.136 225.1.0.0       NotJ,RegP   00:00:27 00:00:35  00:00:08  00:03:27       1
robot#

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-02-20 19:26:05 -05:00
Donald Sharp
97c6009d49
Merge pull request #3760 from patrasar/RP_configure_inconsistent_addr_mask
pimd: reject inconsistent address/mask "ip pim rp command"
2019-02-08 07:37:43 -05:00
Sarita Patra
6b44b40141 pimd: reject inconsistent address/mask "ip pim rp command"
Issue: Configure "ip pim rp x.x.x.x 225.0.0.0/4".
Show running config shows "ip pim rp x.x.x.x 224.0.0.0/4"
This is mis-leading.

Root-cause: Internally 225.0.0.0/4 is getting converted to
224.0.0.0/4 group mask, since the prefix length is 4.

Fix: Restrict the user to configure inconsistent group address
mask by throughing a cli error "Inconsistent address and mask".

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-08 01:35:21 -08:00
Sarita Patra
d23756e938 pimd: Don't refersh the oif_creation timer if S,G already present
Issue: Shut the RP interface in the router RP. LHR will get to know
RP becomes not-reachable, so it send a prune towards the RP. On
receiving the prune, RP clear the (*, G) entry, but (S, G) should
not get removed if present.
Now no-shut the RP interface in the router RP. LHR will send a (*, G)
join towards the RP. On receiving join FRR create the (*, G) entry.
Along with this, it also add the interface(join received) in the OIL
of (S, G) and also refresh the (S, G) timer.

Fix: Dont refresh the timer for S, G or (*, G), if the flag for the
channel OIL is PIM_OIF_FLAG_PROTO_ANY.

Signed-off-by: Sarita Patra <saritap@vmware.com>
2019-02-07 23:50:12 -08:00
Donald Sharp
ee56831894 pimd: Pim is not respecting the move of an interface from old->new vrf
PIM needed to be updated to move to the new vrf.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-02-05 09:13:30 -05:00
Donald Sharp
414d885aac pimd: Add hidden 'ip pim active-active` command
Add a command to track if an interface should be in active-active
mode or not.  This command is hidden at this time because it
is not finished fully.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-31 09:28:39 -05:00
David Lamparter
fdbd8086b1 build: fix a whole bunch of *FLAGS
- some target_CFLAGS that needed to include AM_CFLAGS didn't do so
- libyang/sysrepo/sqlite3/confd CFLAGS + LIBS weren't used at all
- consistently use $(FOO_CFLAGS) instead of @FOO_CFLAGS@
- 2 dependencies were missing for clippy

Signed-off-by: David Lamparter <equinox@diac24.net>
2019-01-30 19:13:51 +01:00
Donald Sharp
9981117a40 pimd: Convert to using an ifindex_t for the vif
Let's stay consistent in the data type for the vif index

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-25 12:07:02 -05:00
Donald Sharp
04b6c83d56 pimd: Prevent crash from using pim static mroutes
If you have an interface being added to a static mroute
and that interface has been configured w/ pim but does
not have a valid ip address yet, we do not create a
VIF for that device yet.  As such when we attempt
to assign the vif array in the pim static data structure
we attempt to write into -1 of that array.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-25 12:07:02 -05:00
Ruben Kerkhof
4d762f2607 Treewide: use ANSI function definitions
Signed-off-by: Ruben Kerkhof <ruben@rubenkerkhof.com>
2019-01-24 11:21:59 +01:00
Donald Sharp
afec9bba1e pimd: Allow pim to display what it believes the mlag role is.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:40 -05:00
Donald Sharp
d6749d74c6 pimd: Store the router mlag role
When we are told about the mlag role, store it for later usage.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
4dfe9ad26e pimd: Remove pimg
The pimg data structure is only used in one spot to send the default
vrf id to zebra upon startup.  Add the default vrf id to the struct pim_router
data structure and remove the pimg pointer.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
84f2598914 pimd: Remove pim_msdp_config_write as it was never used
This function was never used, additionally rename the _helper
function to this name.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
a6c5db596e pimd: Move register_probe_time to pim_router
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
75373ccac4 pimd: Move packet_process variable to pim_router
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
2925dff513 pimd: Move register_suppress_time into struct pim router
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
da03883e1e pimd: Convert rpf_cache_refresh_delay_msec into pim_router struct
Move the rpf_cache_refresh_delay_msec into the pim_router since
it should own the data.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
d17612dd6a pimd: Move the infinite_assert_metric global to pim_router
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
5b45753eff pimd: Convert qpim_t_periodic into the struct pim_router structure
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:39 -05:00
Donald Sharp
046b1aa7d4 pimd: Move debugs into pim_router structure
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:23:38 -05:00
Donald Sharp
36417fcc20 pimd: Create a struct pim_router and move thread master into it
Create a `struct pim_router` and move the thread master into it.
Future commits will further move global varaibles into the pim_router
structure.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:21:00 -05:00
Donald Sharp
ac567a6f4a pimd: Add the reading of capabilities on startup.
Just add the ability to notice the capabilities on startup,
but don't do anything with it yet.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-01-04 12:21:00 -05:00
Donald Sharp
b96892db62 pimd: When we fail to initiate ifchannel backout work done
When we receive a igmp report and attempt to initiate
a pim ifchannel for it and that fails to work then
let's back out the work done setting stuff up to this
point.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-11-15 19:28:43 -05:00
Donald Sharp
78b0c6bfa7 pimd: Add some debugs for when local membership fails
When we fail to add a local membership add some additional debugs
so that we can have a bit more information on when something goes
bad.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-11-15 19:25:58 -05:00
Donald Sharp
26f63a1ec6 *: Replace zclient_new with zclient_new_notify
It's been a year since we added the new optional parameters
to instantiation.  Let's switch over to the new name.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-11-12 09:16:23 -05:00