C Roff M4 Makefile Shell C++
Latest commit 660093c Mar 21, 2017 @troglobit Update section on Commit Messages
This is a good place for a friendly reminder of GIT basics.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
Permalink
Failed to load latest commit information.
include Add a few new compile time options for the configure script Jul 3, 2015
redhat Fix issue #28: Add RedHat init+spec file for .rpm build Oct 6, 2014
.gdbinit Initial commit, import of "upstream" pimd-2.1.0-alpha29.17 from Debian. Jan 16, 2010
.gitignore Update .gitignore to ignore autoconf files Feb 8, 2017
.gitmodules Replace libite GIT submodule with compat/*.c files Jan 1, 2017
.travis.yml Travis-CI: Update to work with new build system Jan 2, 2017
AUTHORS Update my new official email address. Aug 19, 2012
CODE-OF-CONDUCT.md Add files CONTRIBUTING.md and CODE-OF-CONDUCT.md Jul 31, 2015
CONTRIBUTING.md Update section on Commit Messages Mar 21, 2017
CREDITS Update ChangeLog and CREDITS for new v2.3.0 series Jul 3, 2015
ChangeLog.org Update ChangeLog and bump version for v2.3.2 release Mar 10, 2016
FAQ.md Update FAQ, README and example pimd.conf with info on dr-priority. Jul 27, 2015
INSTALL.md Use *BSD friendly way of sending environment variables to make install Jul 31, 2015
LICENSE Initial commit, import of "upstream" pimd-2.1.0-alpha29.17 from Debian. Jan 16, 2010
LICENSE.mrouted Update mrouted license to that available in OpenBSD. Apr 10, 2010
Makefile.am Convert to GNU Configure and Build system Jan 2, 2017
README-config.md Remove compat symlinks to old files, use .md and .org extensions. Jul 27, 2015
README-debug.md Remove compat symlinks to old files, use .md and .org extensions. Jul 27, 2015
README.config.jp Change pimd.conf syntax: rename cand_bootstrap_router to Cisco style Jul 17, 2015
README.md README: Update with info on new build system Jan 2, 2017
RELEASE.NOTES Add note in the file RELEASE.NOTES on the relevance of it. Nov 5, 2014
TODO.org Remove compat symlinks to old files, use .md and .org extensions. Jul 27, 2015
autogen.sh Convert to GNU Configure and Build system Jan 2, 2017
callout.c Remove Emacs version-control: t from all files Jan 2, 2017
config.c Allow use of loopback addresses (/32) Feb 20, 2017
configure.ac Allow use of loopback addresses (/32) Feb 20, 2017
debug.c Remove Emacs version-control: t from all files Jan 2, 2017
debug.h Refactor: use log levels from syslog.h instead of hard coded values Mar 3, 2016
defs.h Remove Emacs version-control: t from all files Jan 2, 2017
dvmrp.h pimd: Change to use stdint.h instead of type unsafe homegrown variants. Oct 26, 2014
dvmrp_proto.c Remove Emacs version-control: t from all files Jan 2, 2017
igmp.c Remove Emacs version-control: t from all files Jan 2, 2017
igmp_proto.c Remove Emacs version-control: t from all files Jan 2, 2017
igmpv2.h Default to IGMPv3 and change default query interval 125 --> 12 sec. Jul 16, 2015
igmpv3.h Remove Emacs version-control: t from all files Jan 2, 2017
inet.c Remove Emacs version-control: t from all files Jan 2, 2017
kern.c Remove Emacs version-control: t from all files Jan 2, 2017
main.c Remove Emacs version-control: t from all files Jan 2, 2017
mrt.c Remove Emacs version-control: t from all files Jan 2, 2017
mrt.h Remove Emacs version-control: t from all files Jan 2, 2017
netlink.c Remove Emacs version-control: t from all files Jan 2, 2017
pathnames.h Fix #65: Missing slash in config file path when using environment var… Feb 11, 2016
pidfile.c Convert to GNU Configure and Build system Jan 2, 2017
pim.c Remove Emacs version-control: t from all files Jan 2, 2017
pim_proto.c Remove Emacs version-control: t from all files Jan 2, 2017
pimd.8 Followup to issue #73: Clarify how rp-candidate and bsr-candidate can… Mar 10, 2016
pimd.conf Followup to issue #73: Clarify how rp-candidate and bsr-candidate can… Mar 10, 2016
pimd.h Fix issue #53: Build problem with Clang, bit shift of negative value … Sep 7, 2015
route.c Remove Emacs version-control: t from all files Jan 2, 2017
routesock.c Remove Emacs version-control: t from all files Jan 2, 2017
rp.c Remove Emacs version-control: t from all files Jan 2, 2017
rsrr.c Remove Emacs version-control: t from all files Jan 2, 2017
rsrr.h Remove Emacs version-control: t from all files Jan 2, 2017
rsrr_var.h Use proper, non-system, header guards Jan 1, 2017
strlcat.c Convert to GNU Configure and Build system Jan 2, 2017
strlcpy.c Convert to GNU Configure and Build system Jan 2, 2017
strtonum.c Convert to GNU Configure and Build system Jan 2, 2017
timer.c Remove Emacs version-control: t from all files Jan 2, 2017
trace.c Remove Emacs version-control: t from all files Jan 2, 2017
trace.h Remove Emacs version-control: t from all files Jan 2, 2017
vif.c Remove Emacs version-control: t from all files Jan 2, 2017
vif.h Remove Emacs version-control: t from all files Jan 2, 2017

README.md

README

Travis Status Coverity Status

Table of Contents

Introduction

pimd is a lightweight, stand-alone PIM-SM/SSM multicast routing daemon available under the free 3-clause BSD license. This is the restored original version from University of Southern California, by Ahmed Helmy, Rusty Eddy and Pavlin Ivanov Radoslavov.

Today pimd is maintained at GitHub. Use its facilities to access the source, report bugs and feature requests, and send patches or pull requests. Official release tarballs at the homepage.

pimd is primarily developed on Linux and should work as-is out of the box on all major distributions. Other UNIX variants (OpenBSD, NetBSD, and FreeBSD) should also work, but are not as thoroughly tested. For some tips and details, see the configure script.

For a summary of changes for each release, see the ChangeLog.

Build & Install

When building pimd from source you first need to run the configure script to generate the file config.mk. The script relies on Bourne shell standard features as well as expr and uname. Any optional pimd features, such as --enable-scoped-acls are activated here as well.

Example:

./configure --enable-scoped-acls && make

sudo make install

The configure script and Makefile supports de facto standard settings and environment variables such as --prefix=PATH and DESTDIR= for the install process. E.g., to install pimd to /usr instead of the default /usr/local, but redirect to a binary package directory in /tmp:

./configure --prefix=/usr && make clean all
make VERSION=2.3.0-1 DESTDIR=/tmp/pimd-2.3.0-1 install

Building from GIT

If you want to contribute, or simply just try out the latest but unreleased features, then you need to know a few things about the GNU build system:

  • configure.ac and a per-directory Makefile.am are key files
  • configure and Makefile.in are generated from autogen.sh
  • Makefile is generated by configure script

To build from GIT you first need to clone the repository and run the autogen.sh script. This requires automake and autoconf to be installed on your system.

git clone https://github.com/troglobit/pimd.git
cd pimd/
./autogen.sh
./configure && make

GIT sources are a moving target and are not recommended for production systems, unless you know what you are doing!

Configuration

The configuration is kept in the file /etc/pimd.conf, the order of the statements are in some cases important.

PIM-SM is a designed to be a protocol independent multicast routing protocol. As such it relies on unicast protocols like, e.g, OSPF, RIP, or static routing entries, to figure out the path to all multicast capable neighboring routers. This information is necessary in setups with more than one route between a multicast sender and a receiver to figure out which PIM router should be the active forwarder.

However, pimd currently cannot retrieve the unicast routing distance (preference) and metric of routes from the system, not from the kernel nor a route manager like zebra. Hence, pimd currently needs to be setup statically on each router using the desired distance and metric for each active interface. If either the distance and/or the metric is missing in an interface configuration, the following two defaults will be used:

default-route-distance   <1-255>     default: 101
default-route-metric     <1-1024>    default: 1024

By default pimd starts up on all interfaces it can find, using the above defaults. To configure individual interfaces use:

phyint <address | ifname> ...

You can reference the interface via either its local IPv4 address or its name, e.g., eth0. Some common interface settings are:

  • disable: Disable pimd on this interface, i.e., do not send or listen for PIM-SM traffic

  • dr-priority <1-4294967294>: The DR Priority option, sent in all all PIM Hello messages. Used instead of the IP address in all DR elections, if all PIM routers in LAN advertise it. The higher, the better, default 1.

  • distance <1-255>: The interface's admin distance value (also confusingly referred to as metric preference in the RFC) in PIM Assert messages. Used with metric to elect the active multicast forwarding router. Defaults to default-route-distance

  • metric <1-1024>: The cost for traversing this router. Used with the preference value above. Defaults to default-route-metric

More interface settings are available, see the pimd(8) manual page for the full details.

The most notable feature of PIM-SM is that multicast is distributed from so called Rendezvous Points (RP). Each RP handles distribution of one or more multicast groups, pimd can be configured to advertise itself as a candidate RP rp-candidate, and request to be static RP rp-address for one or more multicast groups.

rp-address <address> [<group>[/<LENGTH> | masklen <LENGTH]

The rp-address setting is the same as the Cisco ip pim rp-address setting to configure static Rendezvous Points. The first argument can be an IPv4 address or a multicast group address. The default group and prefix length is 224.0.0.0/16. Static RP's always have priority 1.

rp-candidate [address | ifname] [time <10-16383>] [priority <0-255>]

The Rendezvous Point candidate, or CRP, setting is the same as the Cisco ip pim rp-candidate setting. Use it to control which interface that should be used in RP elections.

  • address | ifname: Optional local IPv4 address, or interface name to acquire address from. The default is to use the highest active IP address.

  • time <10-16383>: The interval, in seconds, between advertising this CRP. Default: 60 seconds

  • priority <0-255>: How important this CRP is compared to others. The lower the value here, the more important the CRP. Like Cisco, pimd defaults to priority 0 when this is left out

In the CRP messages sent out by pimd, one or more multicast groups can be advertised using the following syntax.

group-prefix <group>[</LENGTH> | masklen <LENGTH>]

Each group-prefix setting defines one multicast group and an optional mask length, which defaults to 16 if left out. A maximum of 255 multicast group prefix records is possible for the CRP.

To keep track of all Rendezvous Points in a PIM-SM domain there exists a feature called Bootstrap Router. The elected BSR in a PIM-SM domain periodically announces the RP set in Bootstrap messages. For details on PIM BSR operation, see RFC 5059.

bsr-candidate [address | ifname] [priority <0-255>]

The configuration of a Candidate BootStrap Router (CBSR) is very similar to that of CRP, except for the interval time. If either the address or the interface name is left out pimd uses the highest active IP address. If the priority is left out, pimd (like Cisco) defaults to priority 0.

To disable CRP and CBSR completely in pimd, simply comment the two lines out from your pimd.conf, and make sure pimd can find the file. Because if pimd cannot find the file it will default to them enabled, with defaults listed in the pimd.conf included in the distribution.

In a PIM-SM domain there can be two, or more, paths from a designated router (DR) for a multicast sender to reach a receiver. When receivers begin joining multicast groups all data is received via the shared tree (RPT) from each Rendezvous Point (RP). This is often not an optimal route, so when the volume starts exceeding a configurable threshold, on either the last-hop router or the RP itself, the router will attempt to switch to the shortest path tree (SPT) from the multicast source to the receiver.

In versions of pimd prior to 2.2.0 this threshold was confusingly split in two different settings, one for the DR and one for the RP. These settings are still supported, for compatibility reasons and documented in the man-page, but it is strongly recommended to change to the new syntax instead:

spt-threshold [rate <KBPS> | packets <NUM> | infinity] [interval <5-60>]

Only slightly different from the Cisco ip pim spt-threshold setting, pimd can trigger a switch to SPT on a rate or number of packets and you can also tweak the poll interval. It's recommended to keep the interval in the tens of seconds, the default is 100 sec. The default threshold is set to zero packets, which will cause a switch over to the SPT after the first multicast packet is received.

Example

# Interface eth0 is disabled, i.e., pimd will not run there.
phyint eth0 disable

# On this LAN we have a lower numeric IP than other PIM routers
# but we want to take care of forwarding all PIM messages.
phyint eth1 dr-priority 10

# Partake in BSR elections on eth1
bsr-candidate eth1

# Offer to be an RP for all of 224.0.0.0/4
rp-candidate eth1
group-prefix 224.0.0.0 masklen 4

# This is the built-in defaults, switch to SPT on first packet
spt-threshold packets 0 interval 100

Starting

Having set up the configuration file, you are ready to run pimd. As usual, it is recommended that you start it manually first, to make sure everything works as expected, before adding it to your system's startup scripts, with any startup flags it might need.

pimd [-c file] [-d subsys1[,...,subsysN]] [-s level]
  • -c file: Utilize the specified configuration file rather than the default, /etc/pimd.conf
  • -d [subsys1,...,subsysN]: Subsystems to enable debug for when running the daemon. Optional argument, if left out, all subsystems are enabled. Type pimd -h for a full list of subsystems
  • -s level: Log level, one of none, error, warning, notice, info, or debug. Default is notice

Example:

pimd -c /cfg/pimd.conf -digmp_proto,pim_jp,kernel,pim_register

Notice the lack of spaces in the option argument to -d, the long-option --debug=igmp_proto,pim_jp,kernel,pim_registeris slightly more readable.

Monitoring

To see the virtual interface table, including neighboring PIM routers, and the multicast routing table:

pimd -r

or to watch it continually:

watch pimd -r

In addition, pimd logs important events to the system logfile, in particular at startup when parsing the pimd.conf configuration file.

Contributing

pimd is maintained by Joachim Nilsson at GitHub. If you find bugs, have feature requests, or want to contribute fixes or features, check out the code from GitHub:

git clone https://github.com/troglobit/pimd
cd pimd

See the file CONTRIBUTING.md for further details.