2018-12-06 08:36:55 -08:00
|
|
|
.. _mfib:
|
|
|
|
|
|
|
|
IP Multicast FIB
|
|
|
|
----------------
|
|
|
|
|
2020-11-09 10:09:42 +00:00
|
|
|
The two principal differences between multicast and unicast forwarding
|
|
|
|
are:
|
|
|
|
|
|
|
|
* there is no load-balancing among paths, there is only replication
|
|
|
|
across paths.
|
|
|
|
* multicast forwarding has an explicit reverse path forwarding (RPF)
|
|
|
|
check. It will only forward a packet if it arrives from a peer for
|
|
|
|
which it has been explicitly configured to accept.
|
|
|
|
|
|
|
|
The other factor that influences the design of the mFIB is that the
|
|
|
|
match criteria (the prefix) is different. For multicast it is
|
|
|
|
necessary to be able to match on source and destination/group
|
|
|
|
addresses (termed an (S,G)) and only on a destination prefix (a (\*,
|
|
|
|
G/m)). This prefix is much bigger than a unicast prefix, and since
|
|
|
|
unicast scale is almost always greater than multicast scale, it is not
|
|
|
|
a good idea to have a single definition of a prefix. Therefore,
|
|
|
|
there is a fib_prefix_t (and hence a fib_entry_t) and an
|
|
|
|
mfib_prefix_t (and hence a mfib_entry_t).
|
|
|
|
|
|
|
|
The fib_path_t and fib_path_list_t are reused. A path can represent
|
|
|
|
either a peer from which to accept packets or a peer to which to send
|
|
|
|
packets. A path-extension is added to the fib_path_t/mfib_entry_t to
|
|
|
|
describe the role the path plays. Logically the path-list is split
|
|
|
|
into two sets; an accepting set and a forwarding set. The forwarding set
|
|
|
|
contributes a replicate DPO for forwarding and the accepting set
|
|
|
|
contributes a list of interfaces (an mfib_itf_t) for the RPF check.
|
2018-12-06 08:36:55 -08:00
|
|
|
|
|
|
|
An IP multicast FIB (mFIB) is a data-structure that holds entries that
|
2020-11-09 10:09:42 +00:00
|
|
|
represent a (S,G) or a (\*,G/m) multicast group. There is one IPv4 and
|
2018-12-06 08:36:55 -08:00
|
|
|
one IPv6 mFIB per IP table, i.e. each time the user calls 'ip[6] table
|
|
|
|
add X' an mFIB is created.
|
|
|
|
|
2020-11-09 10:09:42 +00:00
|
|
|
Usage
|
|
|
|
^^^^^
|
2018-12-06 08:36:55 -08:00
|
|
|
|
|
|
|
To add an entry to the default mFIB for the group (1.1.1.1, 239.1.1.1)
|
|
|
|
that will replicate packets to GigEthernet0/0/0 and GigEthernet0/0/1, do:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ ip mroute add 1.1.1.1 239.1.1.1 via GigEthernet0/0/0 Forward
|
|
|
|
$ ip mroute add 1.1.1.1 239.1.1.1 via GigEthernet0/0/1 Forward
|
|
|
|
|
|
|
|
the flag 'Forward' passed with the path specifies this path to be part of the replication set.
|
|
|
|
To add a path from GigEthernet0/0/2 to the accepting (RPF) set do:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ ip mroute add 1.1.1.1 239.1.1.1 via GigEthernet0/0/2 Accept
|
|
|
|
|
|
|
|
A (\*,G) entry is added by not specifying a source address:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ ip mroute add 232.2.2.2 via GigEthernet0/0/2 Forward
|
|
|
|
|
|
|
|
A (\*,G/m) entry is added by not specifying a source address and giving
|
|
|
|
the group address a mask:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ ip mroute add 232.2.2.0/24 via GigEthernet0/0/2 Forward
|
|
|
|
|
|
|
|
Entries are deleted when all paths have been removed and all entry flags (see below) are also removed.
|
|
|
|
|
|
|
|
Advanced
|
|
|
|
^^^^^^^^
|
|
|
|
|
|
|
|
There are a set of flags associated only with an entry, see:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ show mfib route flags
|
|
|
|
|
|
|
|
only some of these are relevant over the API/CLI:
|
|
|
|
|
|
|
|
#. Signal - packets that match this entry will generate an event that
|
|
|
|
is sent to the control plane (which can be retrieved via the signal
|
|
|
|
dump API)
|
|
|
|
#. Connected - indicates that the control plane should be informed of
|
|
|
|
connected sources (also retrieved via the signal dump API)
|
|
|
|
#. Accept-all-itf - the entry shall accept packets from all
|
|
|
|
interfaces, thus eliminating the RPF check
|
|
|
|
#. Drop - Drop all packet matching this entry.
|
|
|
|
|
|
|
|
flags on an entry can be changed with:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ ip mroute <PREFIX> <FLAG>
|
|
|
|
|
|
|
|
An alternative approach to the RPF check, that does check the
|
|
|
|
accepting path set, is to give the entry and RPF-ID:
|
|
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
|
|
|
|
$ ip mroute <PREFIX> rpf-id X
|
|
|
|
|
|
|
|
the RPF-ID is an attribute of a received packet's meta-data and is
|
|
|
|
added to the packet when it ingresses on a given entity such as an
|
|
|
|
MPLS-tunnel or a BIER table disposition entry.
|