As of this release pimd is not guaranteed to be backwards compatible with earlier releases. It is recommended to run the same version of pimd on all routers in the same domain. See issue #93 for details.
Note: command line arguments in v3.0 are not compatible with v2.x!
- Converted to GNU Configure & Build system
- Replace libite (
-lite
) GIT submodule with compatibility functions. I.e., as of this releasepimd
is self-hosting again. - PID file is touched to acknowledge
SIGHUP
- Completely changed command line arguments, in part to alert users that this release may not be compatible with their existing PIM routers
- New pimctl(8) tool completely replaces
pimd -r
and SIGUSR1 support, pimd no longer dumps internal state in a pimd.dump file - Add
-i IDENT
to change name ofpimd
in syslog,.conf
file, and PID file. Useful when running multiple daemons, one per multicast routing table - Converted to use
getifaddrs()
when scanning for interfaces. This is required on at least FreeBSD 9, sinceSIOCGIFCONF
seems to be really broken there, at least on systems with lots of interfaces (>30). Problem repored by Vladimir Shunkov - Issue #41: Added systemd unit file
- Issue #56: Support for
disable-vifs
inpimd.conf
- Issue #62: Modify Join/Prune send logic to allow more than ~75 mcast receivers, by Joonas Ruohonen
- Issue #67: Stream optimization, by Mika Joutsenvirta:
- Switch directly to shortest path only in the case of PIM-SSM
- For new IGMP group reports, send PIM Join immediately, saves 0-5 sec
- Forward PIM Join messages immediately
- Issue #89: Allow use of loopback interface as long as MULTICAST flag is set, by Vincent Bernat
- Remove GNU:isms like
%m
and__progname
to be able to build on systems that don't have them, like musl libc in e.g. Alpine Linux - Issue #38: Allow enable
phyint
based on ifname or address. - Issue #68: Do not enumerate VIFs for disabled interfaces. This fix
allows using
pimd
on systems with more than 32 interfaces. - Issue #84: Netlink code warns about missing VIF for disabled interfaces
- Issue #92: Fix RedHat/CentOS
.spec
file, building from GIT and from released tarball, by Sjoerd Boomstra - Issue #93: Fixes a serious issue with the RP hash algorithm used in RP
elections. The change makes
pimd
compatible with Cisco IOS, but it also makespimd
v3.0 incompatible with earlierpimd
releases. Found and fixed by Xiaodong Xu
v2.3.2 - 2016-03-10
Bug fix release. All users should upgrade, in particular FreeBSD users!
- Minor code cleanup and readability changes to simplify the code.
- Update to libite v1.4.2 with improved
min()
/max()
macros - Use
-Wextra
not-Werror
in defaultCFLAGS
, this to ensure that pimd still builds OK on newer and more pedantic compilers - Update man page and example
pimd.conf
with details onrp-candidate
bsr-candidate
, two very important settings for correct operation.
- Issue #57: Multicast routing table not updated on FreeBSD. Introduced with issue #23, in pimd v2.2.0. Too intrusive changes altered handling (forwarding) of PIM register messages. This only affects BSD systems, in particular FreeBSD 10.2 (current), or any FreeBSD < 11.0
- Issue #63: Mika Joutsenvirta [email protected] found and fixed serious issues with the PIM Assert timeout handling.
- Issue #65: Missing slash in config file path when using env. variable
- Issue #66: Make it possible to run
pimd
without a configuration file. Ifpimd
cannot find its configuration file it will use built-in fallback settings forbsr-candidate
andrp-candidate
. This to ensure you do not end up with a non-working setup. To disablebsr-candidate
andrp-candidate
, simply leave them out of your config file, and make surepimd
can find the file. - Issue #69: Rate limit only what is actually logged. The
logit()
function counted filtered messages, causing long periods of silence for no reason. Fix by Apollon Oikonomopoulos [email protected]
v2.3.1 - 2015-11-15
Bug fix release.
- Let build system handle missing libite GIT submodule
- Issue #61: Debian packaging moved to https://github.com/bobek/pkg-pimd
- Issue #53: Build problem with Clang on FreeBSD
- Issue #55: Default config uses
/etcpimd.conf
instead of/etc/pimd.conf
. Slashes added and nowpimd -h
lists the default path instead of a hard coded string. - Issue #60: Fix minor spelling errors.
v2.3.0 - 2015-07-31
The PIM-SSM & IGMPv3 release!
The significant new features in this release were made possible thanks to the hard work of Markus Veranen [email protected] and Mika Joutsenvirta [email protected].
Tested on Ubuntu 14.04 (GLIBC/Linux 3.13), Debian 8.1 (GLIBC/Linux 3.16), FreeBSD, NetBSD, and OpenBSD.
-
Support for PIM-SSM and IGMPv3, by Markus Veranen
-
IGMPv3 is now default, use
phyint ifname igmpv2
for old behaviour -
Default IGMP query interval has changed from 125 sec to 12 sec
In
pimd.conf: igmp-query-interval <SEC>
-
Default IGMP querier timeout has changed from 255 sec to 42 sec
In
pimd.conf: igmp-querier-timeout <SEC>
-
The built-in IGMP robustness value changed from 2 to 3
-
Support for changing the PIM Hello interval, by Markus Veranen
In
pimd.conf: hello-interval <SEC>
-
Support for multiple multicast routing tables, and running multiple pimd instances, by Markus Veranen. (Only supported on Linux atm.)
-
Support for advertising, and acting upon changes to, Generation ID in PIM Hello messages, by Markus Veranen
-
Support for advertising DR Priority option in PIM Hello messages. If all routers on a LAN send this option this value is used in the DR election rather than the IP address. The priority is configured per
phyint
. This closes the long-standing issue #5. -
Distribution archive format changed from XZ to Gzip, for the benefit of OpenBSD that only ships Gzip in the base system.
The pimd.conf
syntax has been changed in this release. Mainly, the
configuration file now use dashes -
instead of underscore _
as word
separators. However several settings have also been renamed to be more
familiar to commands used by major router vendors:
bsr-candidate
: replacescand_bootstrap_router
rp-candidate
: replacescand_rp
group-prefix
: replacesgroup_prefix
rp-address
: replacesrp_address
spt-threshold
: replaces theswitch_register_threshold
andswitch_data_threshold
settingshello-interval
: replaceshello_period
default-route-distance
: replacesdefault_source_preference
default-route-metric
: replacesdefault-source-metric
Also, for phyint
the preference
sub-option has been replaced with
the less confusing distance
and ttl-threshold
replaces threshold
.
See the README or the man page for more information on the metric
preference and admin distance confusion.
Note: The
pimd.conf
parser remains backwards compatible with the old syntax!
The following are new features that must be enabled at compile time,
using the configure
script, to take effect. For details, see
./configure --help
--prefix=PATH
: Standard prefix to be used at installation, default/usr/local
--sysconfdir=PATH
: Prefix path to be used forpimd.conf
, default/etc
, unless--prefix
is given.--embedded-libc
: Enable uClib or musl libc build, on Linux.--disable-exit-on-error
: Allow pimd to continue running despite encountering errors.--disable-pim-genid
: Disable advertisement of PIM Hello GenID, use for compatibility problems with older versions of pimd.--with-max-vifs=MAXVIFS
: Raise max number of VIFs to MAXVIFS.
Note: this requires raising MAXVIFS in the kernel as well! Most kernels cannot handle >255, if this is a problem, try using multiple multicast routing tables instead.--disable-masklen-check
: Allow tunctl VIFs with masklen 32.
- Fix issue #40: FTBS with
./configure --enable-scoped-acls
- Properly support cross compiling. It is now possible to actually
define the
$CROSS
environment variable when callingmake
to allow cross compiling pimd. Should work with both GCC and Clang. Tested on Ubuntu, Debian and FreeBSD.
v2.2.1 - 2015-04-20
- Fix another problem with issue #22 (reopened), as laid out in issue
#37. This time the crash is induced when there is a link down event.
Lot of help debugging the propblem by @mfspeer, who also suggested
the fix -- to call
pim_proto.c:delete_pim_nbr()
invif.c:stop_vif()
instead of just calling free. - Fix issue with not checking return value of
open()
in daemonizing code inmain()
, found by Coverity Scan. - Fix issue with scoped
phyint
inconfig.c
, found by Coverity Scan.masklen
may not be zero, config file problem, alert user.
v2.2.0 - 2014-12-28
- Support for IP fragmentation of PIM register messages, by Michael Fine, Cumulus Networks
- Support
/LEN
syntax inphyint
, complementmasklen LEN
, issue #12 - Support for /31 networks, point-to-point, by Apollon Oikonomopoulos
- Remove old broken SNMP support
- OpenBSD inspired cleanup (deregister)
- General code cleanup, shorten local variable names, func decl. etc.
- Support for router alert IP option in IGMP queries
- Support for reading IGMPv3 membership reports
- Update IGMP code to support FreeBSD >= 8.x
- Retry read of routing tables on FreeBSD
- Fix join/leve of ALL PIM Routers for FreeBSD and other UNIX kernels
- Tested on FreeBSD, NetBSD and OpenBSD
- Add very simple homegrown configure script
- Update and document support for
rp_address
,cand_rp
, andcand_bootstrap_router
- Add new
spt_threshold
to replace existingswitch_register_threshold
andswitch_data_threshold settings
. Cisco-like and easier to understand
- Avoid infinite loop during unicast send failure, by Alex Tessmer
- Fix bug in bootstrap when configured as candidate RP, issue #15
- Fix segfault in
accept_igmp()
, issue #29 - Fix default source preference, should be 101 (not 1024!)
- Fix issue #23:
ip_len
handling on older BSD's, thanks to Olivier Cochard-Labbé - Fix default prefix len in static RP example in
pimd.conf
- Fix issue #31: Make IGMP query interval and querier timeout configurable
- Fix issue #33: pimd does not work in background under FreeBSD
- Fix issue #35: support for timing out other queriers from mrouted
- Hopefully fix issue #22: Crash in (S,G) state when neighbor is lost
- Misc. bug fixes thanks to Coverity Scan, static code analysis tool https://scan.coverity.com/projects/3319
v2.1.8 - 2011-10-22
- Update docs of static Rendez-Vous Point,
rp_address
, configuration in man page and examplepimd.conf
. Thanks to Andriy Senkovych [email protected] and YAMAMOTO Shigeru [email protected] - Replaced
malloc()
withcalloc()
to mitigate risk of accessing junk data and ease debugging, by YAMAMOTO Shigeru [email protected] - Extend .conf file
rp_address
option withpriority
field. Code changes and doc updates by YAMAMOTO Shigeru [email protected]
- A serious bug in
pim_proto.c:receive_pim_register()
was found and fixed by Jean-Pascal Billaud. In essence, the RP check was broken since the code only looked atmy_cand_rp_address
, which is not set when using therp_address
config. Everything works fine with auto-RP mode though. This issue completely breaks the register path since the JOIN(S,G) is never sent back ... - Fix FTBFS issues reported from Debian. Later GCC versions trigger unused variable warnings. Fixes by Antonin Kral [email protected]
v2.1.7 - 2011-01-09
-
The previous move of runtime dump files to
/var/lib/misc
have been changed to/var/run/pimd
instead. This to accomodate *BSD systems that do not have the/var/lib
tree, and also recommended in the Filesystem Hierarchy Standard:http://www.pathname.com/fhs/pub/fhs-2.3.html#VARRUNRUNTIMEVARIABLEDATA
v2.1.6 - 2011-01-08
- Debian package now conflicts with
smcroute
, in addition tomrouted
. It is only possible to run one multicast routing daemon at a time, kernel limitation. - The location of the dump file(s) have been moved from
/var/tmp
to/var/lib/misc
due to the insecure nature of/var/tmp
. See more below.
kern.c:k_del_vif()
: Fix build error on GNU/kFreeBSD- CVE-2011-0007: Insecure file creation in
/var/tmp
. "On USR1, pimd will write to/var/tmp/pimd.dump
a dump of the multicast route table. Since/var/tmp
is writable by any user, a user can create a symlink to any file he wants to destroy with the content of the multicast routing table."
v2.1.5 - 2010-11-21
- Improved error messages in kern.c
- Renamed CHANGES to ChangeLog
-
Import mrouted fix: on GNU/Linux systems (only!) the call to
kern.c:k_del_vif()
fails with:setsockopt MRT_DEL_VIF on vif 3: Invalid argument
. This is due to differences in the Linux and *BSDMRT_DEL_VIF
API. The Linux kernel expects to receive astruct vifctl
associated with the VIF to be deleted, *BSD systems on the other hand expect to receive the index of that VIF.Bug reported and fixed on mrouted by Dan Kruchinin [email protected]
v2.1.4 - 2010-09-25
- Support Debian GNU/kFreeBSD, FreeBSD kernel with GNU userland.
- Lior Dotan [email protected] reports that pimd 2.1.2 and 2.1.3 are
severely broken w.r.t. uninformed systematic replace of
bcopy()
withmemcpy()
API.
v2.1.3 - 2010-09-08
debug.c:syslog()
: Removed GNU:ism %m, usestrerror(errno)
instead.- Cleanup and ansification of: rp.c, mrt.c, vif.c, route.c
- Initialize stack variables to silence overzealous GCC on PowerPC and S/390. Debian bug 595584, this closes pimd issue #3 on GitHub.
- Bug fix for static-rp configurations from Kame's pim6sd route.c r1.28
- Close TODO, merge in relevant changes from Kame's pim6sd
vif.c r1.3
- Tried fixing
debug.c:logit()
build failure on Sparc due to mixup in headers fortv_usec
type.
v2.1.2 - 2010-09-04
- License change on mrouted code from OpenBSD team => pimd fully free under the simlified 3-clause BSD license! This was also covered in v2.1.0-alpha29.17, but now all files have been updated, including LICENSE.mrouted.
- Code cleanup and ansification.
- Simplify Makefile so it works seamlessly on GNU Make and BSD PMake.
- Replaced
bzero()
andbcopy()
withmemset()
andmemcpy()
. - Use
getopt_long()
for argument parsing. - Add, and improve,
-h,--help
output. - Add
-f,--foreground
option. - Add
-v,--version
option. - Add
-l,--reload-config
which sends SIGHUP to a running daemon. - Add
-r,--show-routes
which sends SIGUSR1 to a running daemon. - Add
-q,--quit-daemon
which sends SIGTERM to a running daemon. - Enable calling pimd as a regular user, for
--help
and--version
. - Man page cleaned up, a lot, and updated with new options.
- Replaced dangerous string functions with
snprintf()
andstrlcpy()
- Added checks for
malloc()
return values, all over the code base. - Fixed issues reported by Sparse (CC=cgcc).
- Retry syscalls
recvfrom()
andsendto()
on signal (SIGINT). - Fix build issues on OpenBSD 4.7 and FreeBSD 8.1, Guillaume Sellier.
- Kernel include issues on Ubuntu 8.04, Linux <= 2.6.25, Nikola Knežević
- Fix build issues on NetBSD
v2.1.1 - 2010-01-17
Merged all patches from http://lintrack.org.
- Bumping version again to celebrate the changes and make it easier for distributions to handle the upgrade.
002-better-rp_address.diff
: Support multicast group address in static Rendez-Vous Point .conf option.004-disableall.diff
: Add -N option to pimd.005-vifenable.diff
: Add enable keyword to phyint .conf option.
001-debian-6.diff
: Already merged, no-op - only documenting in case anyone wonders about it.003-ltfixes.diff
: Various bug fixes and error handling improvements.006-dot19.diff
: The lost alpha29.18 and alpha29.19 fixes by Pavlin Radoslavov.
v2.1.0 - 2010-01-16
First release from new home at GitHub and by new maintainer.
- Integrated the Debian patches from
pimd_2.1.0-alpha29.17-9.diff.gz
- Fixed the new file include/linux/netinet/in-my.h (Debian) so that the #else fallback uses the system netinet/in.h, which seems to work now.
- Bumped version number, this code has been available for a while now.
- Don't ignore PIM Null Register messages if the IP version of the inner header is not valid.
- Add a missing bracket inside rsrr.c (a bug report and a fix by [email protected])
- Compilation fix for Solaris 8. Though, no guarantee pimd still works on that platform.
- Define
BYTE_ORDER
if missing. - Update include/netinet/pim.h file with its lastest version
- Update the copyright message of
include/netinet/pim_var.h
-
The mrouted license, LICENSE.mrouted, updated with BSD-like license!! Thanks to the OpenBSD folks for the 2 years of hard work to make this happen:
http://www.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/mrouted/LICENSE
-
Moved the pimd contact email address upfront in README. Let me repeat that here: If you have any questions, suggestions, bug reports, etc., do NOT send them to the PIM IETF Working Group mailing list! Instead, use the contact email address specified in README.
- Compilation bugfix for Linux. Bug report by Serdar Uezuemcue [email protected]
- Routing socket descriptor leak. Bug report and fix by SUZUKI Shinsuke [email protected], incorporated back from pim6sd.
- PIM join does not go upstream. Bug report and fix by SUZUKI Shinsuke [email protected], incorporated back from pim6sd.
[problem]
PIM join does not go upstream in the following topology, because oif-list
is NULL after subtracting iif from oif-list.
receiver---rtr1---|
rtr2---|---rtr3----sender
rtr1's nexthop to sender = rtr2
rtr2's nexthop to sender = rtr3
[reason]
Owing to a difference between RFC2362 and the new pim-sm draft.
[solution]
Prunes iif from oiflist when installing it into kernel, instead of
PIM route calculation time.
- Bugfix in calculating the netmask for POINTOPOINT interface in config.c. Bug report by J.W. (Bill) Atwood [email protected]
rp.c:rp_grp_match()
: SERIOUS bugfix in calculating the RP per group when there are a number of group prefixes in the Cand-RP set. Bug report by Eva Pless [email protected]
- Bugfix in rp.c
bootstrap_initial_delay()
in calculating BSR election delay. Fix by SAKAI Hiroaki [email protected]
- Increase size of send buffers in the kernel. Bug report by Andrea Gambirasio [email protected]
Bug reports and fixes by SAKAI Hiroaki [email protected]
init_routesock()
: Bugfix: initializing a forgotten variable. The particular code related to that variable is commented-out by default, but a bug is a bug.main.c:restart()
: Bugfix: close theudp_socket
only when it is is different fromigmp_socket
.main.c:main()
: if SIGHUP signal is received, reconstruct readers and nfds- Three serious bug fixes thanks to Jiahao Wang [email protected]
and Bo Cheng [email protected]:
pim_proto.c:receive_pim_join_prune()
: two bugfixes related to the processing of(*,*,RP)
pim_proto.c:add_jp_entry()
: Bugfix regarding adding prune entries
- Remove the FTP URL from the various README files, and replace it with an HTTP URL, because the FTP server on catarina.usc.edu is not operational anymore.
- Widen space for "Subnet" addresses printed in "Virtual Interface Table"
- Added (commented-out code) to enable different interfaces to belong to overlapping subnets. See around line 200 in config.c
- Bugfix in handling of Join/Prune messages when there is one join and one prune for the same group. Thanks to Xiaofeng Liu [email protected]
First three entries contributed by Hiroyuki Komatsu [email protected]
- Print line number if there is conf file error.
- If there is an error in the conf file, pimd won't start.
- GRE configuration examples added to README.config.
- New file README.debug (still very short though).
- Increase the config line buffer size to 1024. Bug fix by Hiroyuki Komatsu [email protected]
- Better log messages for point-to-point links in config.c. Thanks to Hitoshi Asaeda [email protected]
- Added
phyint altnet
(see pimd.conf for usage) for allowing some senders look like directly connected to a local subnet. Implemented by Marian Stagarescu [email protected] - Added
phyint scoped
(see pimd.conf for usage) for administratively disabling the forwarding of multicast groups. Implemented by Marian Stagarescu [email protected] - The License has changed from the original USC to the more familiar BSD-like (the KAME+OpenBSD guys brought to my attention that the original working in the USC license "...and without fee..." is ambiguous and makes it sound that noone can distribute pimd as part of some other software distribution and charge for that distribution.
- RSRR disabled by default in Makefile
- Memory leaks bugs fixed in rp.c, thanks to Sri V [email protected]
- Compilation problems for RedHat-7.1 fixed. Bug report by Philip Ho [email protected]
- PID computation fixed (it should be recomputed after a child
fork()
). Thanks to Marian Stagarescu [email protected] find_route()
-related bug fixes (always explicitly check for NULL return). Bug report by Marian Stagarescu [email protected]- Bug fix re. adding a local member with older Ciscos in
add_leaf()
. Bug report by Marian Stagarescu [email protected] - Added explicit check whether
BYTE_ORDER
in pimd.h is defined. Bug report by [email protected]
- Bug fixes in processing Join/Prune messages. Thanks to Sri V [email protected]
VIFM_FORWARDER()
macro renamed toVIFM_LASTHOP_ROUTER
.- Mini-FAQ entries added to README.
- When there is a new member,
add_leaf()
is called by IGMP code for any router, not only for a DR. The reason is because not only the DR must know about local members, but the last-hop router as well (so eventually it will initiate a SPT switch). Similar fixes toadd_leaf()
inside route.c as well. Problem reported by Hitoshi Asaeda [email protected]. XXX: Note the lenghty comment in the beginning ofadd_leaf()
about a pimd desing problem that may result in SPT switch not initiated immediately by the last-hop router. - DR entry timer bug fix in timer.c: When
(*,G)
's iif and (S,G)'s iif are not same, (S,G)'s timer for the DR doesn't increase. Reported indirectly by [email protected]
- README cleanup + Mini-FAQ added
igmp_proto.c
: printf argument cleanup (courtesy KAME)main.c:restart()
: forgotten printf argument added (courtesy KAME)
kern.c:k_stop_pim()
: Fix the ordering ofMRT_PIM
andMRT_DONE
, thanks to Hitoshi Asaeda [email protected]route.c:add_leaf()
: mrtentry creation logic bug fix. If the router is not a DR, a mrtentry is never created. Tanks to Hitoshi Asaeda [email protected] & (indirectly) [email protected]pim_proto.c
: Two critical bug fixes. J/P prune suppression related message and J/P message with(*,*,RP)
entry inside. Thanks to Azzurra Pantella [email protected] and Nicola Dicosmo from University of Pisapim_proto.c:receive_pim_bootstrap()
: BSR-related fix from Kame's pim6sd. Even when the BSR changes, just schedule an immediate advertisemnet of C-RP-ADV, instead of sending message, in order to avoid sending the advertisement to the old BSR. In response to comment from [email protected]
ADVANCE()
bug fix in routesock.c (if your system doesn't haveSA_LEN
) thanks to Eric S. Johnson [email protected]
NB: THIS pimd VERSION WON'T WORK WITH OLDER PIM-SM KERNEL PATCHES (kernel patches released prior to this version)!
- The daemon that the kernel will prepare completely the inner multicast packet for PIM register messages that the kernel is supposed to encapsulate and send to the RP.
- Now pimd compiles on OpenBSD-2.7. PIM control messages exchange test passed. Don't have the infrastructure to perform more complete testing.
main.c:cleanup()
: SendPIM_HELLO
with holdtime of '0' if pimd is going away, thanks to JINMEI Tatuya [email protected]include/netinet/pim.h
updated- pimd code adapted to the new
struct pim
definition. - Added
PIM_OLD_KERNEL
andBROKEN_CISCO_CHECKSUM
entries in the Makefile. - Don't ignore kernel signals if any of src or dst are NULL.
- Don't touch
ip_id
on a PIM register message - README cleanup: kernel patches location, obsolete systems clarification, etc.
k_stop_pim()
added tocleanup()
inmain.c
(courtesy Kame)
RANDOM()
related bug fix re.jp_value
calculation inpim_proto.c
, thanks to JINMEI Tatuya [email protected]realloc()
related memory leak bug inconfig_vifs_from_kernel()
in config.c courtesy Kame's pim6sd code.- Solaris-8 fixes thanks to Eric S. Johnson [email protected]
BROKEN_CISCO_CHECKSUM
bug fix thanks to Eric S. Johnson [email protected] and Hitoshi Asaeda.main.c
: 1000000 usec -> 1 sec 0 usec. Fix courtesy of the Kame Projectmain.c:restart()
fixup courtesy of the Kame Project- various min. message length check for the received control messages courtesy of the Kame project. XXX: the pimd check is not enough!
- VIF name string comparison fix in
routesock.c:getmsg()
, courtesy of the Kame project - Missing brackets added inside
age_routes()
, shows up only ifKERNEL_MFC_WC_G
is defined, courtesy of the Kame Project
- added #ifdef
BROKEN_CISCO_CHECKSUM
(disabled by default) to make cisco RPs happy (read the comments in pim.c) - added #ifdef
PIM_TYPEVERS_DECL
in netinet/pim.h as a workaround that ANSI-C doesn't guarantee that bit-fields are tightly packed together (although all modern C compilers should not create a problem).
- Fixes to enable point-to-point interfaces being added correctly, thanks to Roger Venning [email protected]
- A number of minor bug fixes
NB: this release may the the last one from 2.1.0. The next release will be 2.2.0 and there will be lots of changes inside.
- Bug fix in
rp.c:add_grp_mask()
andrp.c:delete_grp_mask()
: in some cases if the RPs are configured with nested multicast prefixes, the add/delete may fail. Thanks to Hitoshi Asaeda and the KAME team for pointing out this one.
-
Bug fix in
receive_pim_register()
inpim_proto.c:ntohl()
was missing insideIN_MULTICAST()
. Thanks to Fred Griffoul [email protected] -
Bug report and fix by Hitoshi Asaeda [email protected] in
pim_proto.c:receive_pim_cand_rp_adv()
(if a router is not a BSR). Another bug inrp.c:delete_grp_mask_entry()
: an entry not in the head of the list was not deleted propertly. -
Some
VIFF_TUNNEL
checks added or deleted in various places. Slowly preparing pimd to be able to work with GRE tunnels...
Bug reports and fixes by Hitoshi Asaeda [email protected] inside
parse_reg_threshold()
and parse_data_threshold()
in config.c
- Successfully added multicast prefixes configured in pimd.conf are displayed at startup
- Use
include/freebsd
as FreeBSD-3.x include files andinclude/freebsd2
for FreeBSD-2.x.
- Test is performed whether a
PIM_REGISTER
has invalid source and/or group address of the internal packet.
PIM_DEFAULT_CAND_RP_ADV_PERIOD
definition set to 60, but default time value for inter Cand-RP messages is set in pimd.conf to 30 sec.PIM_REGISTER
checksum verification inreceive_pim_register()
relaxed for compatibility with some older routers. The checksum has to be computed only over the first 8 bytes of the PIM Register (i.e. only over the header), but some older routers might compute it over the whole packet. Hence, the checksum verification is over the first 8 bytes first, and if if it fails, then over the whole packet. Thus, pimd that is RP should still work with older routers that act as DR, but if an older router is the RP, then pimd cannot be the DR. Sorry, don't know which particular routers and models create the checksum over the whole PIM Register (if there are still any left).
- Finally pimd works under Linux (probably 2.1.126, 2.2.x and 2.3.x).
However, a small fix in the kernel
linux/net/ipv4/ipmr.c
is necessary. In functionpim_rcv()
, remove the call toip_compute_csum()
:
--- linux/net/ipv4/ipmr.c.org Thu Mar 25 09:23:34 1999
+++ linux/net/ipv4/ipmr.c Mon May 24 15:42:45 1999
@@ -1342,8 +1342,7 @@
if (len < sizeof(*pim) + sizeof(*encap) ||
pim->type != ((PIM_VERSION<<4)|(PIM_REGISTER)) ||
(pim->flags&PIM_NULL_REGISTER) ||
- reg_dev == NULL ||
- ip_compute_csum((void *)pim, len)) {
+ reg_dev == NULL) {
kfree_skb(skb);
return -EINVAL;
}
- in pimd.conf
phyint
can be specified not only by IP address, but by name too (e.g.phyint de1 disable
) - in pimd.conf
preference
andmetric
can be specified perphyint
Note that thesepreference
andmetric
are like per iif. MRT_PIM
used (again) instead ofMRT_ASSERT
in kern.c. The problem is that Linux has bothMRT_ASSERT
andMRT_PIM
, while *BSD has onlyMRT_ASSERT
.
#ifndef MRT_PIM
#define MRT_PIM MRT_ASSERT
#endif
- Rely on
__bsdi__
, which is defined by the OS, instead of-DBSDI
in Makefile, change by Hitoshi Asaeda. Similarly, use__FreeBSD__
instead of-DFreeBSD
- Linux patches by Fred Griffoul [email protected] including a
netlink.c
instead ofroutesock.c
vif.c:zero_vif()
: New function
All bug reports thanks to Kaifu Wu [email protected]
- Linux-related bug fixes regarding raw IP packets byte ordering
- Join/Prune message bug fixed if the message contains several groups joined/pruned
Bug reports by Jonathan Day [email protected]
- Bug fixes to compile under newer Linux kernel (linux-2.1.127) To
compile for older kernels (ver < ???), add
-Dold_Linux
to the Makefile - For convenience, the
include/linux/netinet/{in.h,mroute.h}
files are added, with few modifications applied.
pim_proto.c:join_or_prune()
: Bug fixes in case of (S,G) overlapping with(*,G)
. Bug report by Dirk Ooms [email protected]route.c:change_interfaces()
: Join/Prune(*,G)
,(*,*,RP)
fire timer optimization/fix.
- (Almost) all timers manipulation now use macros
pim.h
andpim_var.h
are in separate common directory- Added BSDI definition to
pim_var.h
, thanks to Hitoshi Asaeda.
- fix TIMEOUT definitions in difs.h (bug report by Nidhi Bhaskar) (originally, if timer value less than 5 seconds, it won't become 0) It is HIGHLY recommended to apply that fix, so here it is:
-------------BEGIN BUG FIX-------------------
1) Add the following lines to defs.h (after #define FALSE):
#ifndef MAX
#define MAX(a,b) (((a) >= (b))? (a) : (b))
#define MIN(a,b) (((a) <= (b))? (a) : (b))
#endif /* MAX & MIN */
2) Change the listed below TIMEOUT macros to:
#define IF_TIMEOUT(timer) \
if (!((timer) -= (MIN(timer, TIMER_INTERVAL))))
#define IF_NOT_TIMEOUT(timer) \
if ((timer) -= (MIN(timer, TIMER_INTERVAL)))
#define TIMEOUT(timer) \
(!((timer) -= (MIN(timer, TIMER_INTERVAL))))
#define NOT_TIMEOUT(timer) \
((timer) -= (MIN(timer, TIMER_INTERVAL)))
---------------END BUG FIX-------
Both bug reports by Chirayu Shah [email protected]
- bug fix in
find_route()
when searching for(*,*,RP)
- bug fix in
move_kernel_cache()
: no need to domove_kernel_cache()
from(*,*,R)
to(*,G)
first when we callmove_kernel_cache()
for (S,G)
- Now compiles under Linux (haven't checked whether the PIMv2 kernel support in linux-2.1.103 works)
parse_default_source*()
bug fix (bug reports by Nidhi Bhaskar)- allpimrouters deleted from igmp.c (already defined in pim.c)
- igmpmsg defined for IRIX
(*,G)
MFC kernel support completed and verified. Compile withKERNEL_MFC_WC_G
defined in Makefile, but then must use it only with a kernel that supports(*,G)
, e.g.pimkern-PATCH_7
. Currently, kernel patches available for FreeBSD and SunOS only.
MRTF_MFC_CLONE_SG
flag set afterdelete_single_kernel_cache()
is called
- PIM registers kernel encapsulation support. Build with
PIM_REG_KERNEL_ENCAP
defined in Makefile. (*,G)
MFC support. Build withKERNEL_MFC_WC_G
defined in Makefile. However,MFC_WC_G
is still not supported withpimkern-PATCH_6
, must disable it for now.mrt.c:delete_single_kernel_cache_addr()
: New function, uses source, group to specify an MFC to be deleted
- Another few bug fixes related to NetBSD definitions thanks to Heiko W.Rupp [email protected]
- A few bug fixes related to NetBSD definitions thanks to Heiko W.Rupp [email protected]
- If the RP changes, the necessary actions are taken to pass the new RP
address to the kernel. To be used for kernel register encap support.
Wnat needs to be done is: (a) add
rp_addr
entry to the mfcctl structure, and then just set it inkern.c:k_chf_mfc()
. Obviously, the kernel needs to support the register encapsulation (instead of sending WHOLEPKT to the user level). In the near few days will make the necessary kernel changes. change_interfaces()
: Added "flags" argument. The only valid flag isMFC_UPDATE_FORCE
, used for forcing kernel call when only the RP changes.k_chg_mfc()
has a new argument: rpaddr. To be used for kernel register encapsulation supportMRT_PIM
completely replaced byMRT_ASSERT
move_kernel_cache()
: ArgumentMFC_MOVE_FORCE
is a flag instead of TRUE/FALSEprocess_cache_miss()
: removed unneeded piece of code
- Use the cleaned up
netinet/pim.h
- Remove the no needed anymore pim header definition in
pimd.h
- Don't use
MRT_PIM
in in kern.c anymore, replaced back withMRT_ASSERT
. added default_source_metric
anddefault_source_preference
(1024) because the kernel's unicast routing table is not a good source of info; configurable in pimd.conf- Can now compile under NetBSD-1.3, thanks to Heiko W.Rupp [email protected]
- Incorrect setup of the borderBit and nullRegisterBit (different for
big and little endian machines) fixed;
*_BORDER_BIT
and*NULL_REGISTER_BIT
redefined - don't send
pim_assert
on tunnels or register vifs (if for whatever reason we receive on such interface) - ignore
WRONGVIF
messages for register and tunnel vifs (the cleaned up kernel mods dont send such signal, but the older (before May 9 '98) pimd mods that signaling was enabled
vif.c:find_vif_direct_local()
: New function, used inroutesock.c
,igmp_proto.c
- Use
MFC_MOVE_FORCE/MFC_MOVE_DONT_FORCE
flag inmrt.c
,route.c
,pim_proto.c
, when need to move the kernel cache entries between(*,*,RP)
,(*,G)
,(S,G)
- new timer related macros:
SET_TIMER()
,FIRE_TIMER()
,IF_TIMER_SET()
,IF_TIMER_NOT_SET()
timer.c:age_routes()
: bunch of fixes regarding J/P message fragmentationroute.c:process_wrong_iif()
: (S,G) SPT switch bug fix: ANDedMRTF_RP
fixed toMRTF_RP
pim_proto.c
&timer.c
: (S,G) Prune now is sent toward RP, when iif toward S and iif toward RP are differentpim_proto.c:join_or_prune()
bug fixespim_proto.c
: (S,G) Prune entry's timer now set to J/P message holdtimepim_proto.c:receive_pim_join_prune()
: Ensure pruned interfaces are correctly reestablishedtimer.c:age_routes()
: now (S,G) entry with local members (inherited from(*,G)
) is timeout propertlytimer.c:age_routes()
: (S,G) J/P timer restarted propertlytimer.c:age_routes()
: check also the (S,G)RPbit entries in the forwarders and RP and eventually switch to the shortest path if data rate too highroute.c:process_wrong_vif()
fire J/P timerroute.c:switch_shortest_path()
: reset the iif toward S if there is already (S,G)RPbit entry
Temp. non-public release.
interval
can be applied for data rate check. The statement inpimd.conf
that only the default value will be used is not true anymore.- The RP-initiated and the forwarder-initiated (S,G) switch threshold rate can be different.
pim_proto.c:receive_pim_register()
: check if I am the RP for that group, and if "no", sendPIM_REGISTER_STOP
(XXX: not in the spec, but should be!)pim_proto.c:receive_pim_register_stop()
: check if thePIM_REGISTER_STOP
originator is really the RP, before suppressing the sending of the PIM registers. (XXX: not in the spec but should be there)rp.c:check_mrtentry_rp()
: new function added to check whether the RP address is the corresponding one for the given mrtentrydebug.c:dump_mrt()
timer values addedroute.c
:add_leaf()
,process_cache_miss()
,process_wrong_iif()
no routing entries created for the LAN scoped addressesDEBUG_DVMRP_DETAIL
andDEBUG_PIM_DETAIL
added
mrt.c:add_kernel_cache()
: no kernel cache duplicatesmrt.c:move_kernel_cache()
: if the iif of the(*,*,R)
(or(*,G)
) and (S,G) are different, dont move the cache entry "UP"timer.c:age_routes()
: (S,G)add_jp_entry()
flag fixed, SPT switch related.kern.c:k_get_sg_cnt()
: modified to compensate for the kernel's return code bug for getting (S,G) byte count (SIOCGETSGCNT
)pim_proto.c:receive_pim_register()
: if the (S,G) oif is NULL, now checks whether the iif isregister_vif
- "non-commersial" statement deleted from the copyright message
- mrinfo support added
- mtrace support added (not completed and not enough tested)
- if invalid local address for
cand_rp
orcand_bootstrap_router
inpimd.conf
, automatically will use the largest local multicast enabled address - include directory for FreeBSD and SunOS added, so now pimd can be compiled without having the necesary include files added to your system. Probably a bad idea and may remove it later.
- Fixed some default values for the IP header of IGMP and PIM packets
VIFF_PIM_NBR
andVIFF_DVMRP_NBR
flags addedVIFF_REGISTER
now included in the RSRR vifs reportfind_route()
debug messages removed- #ifdef for
HAVE_SA_LEN
corrected debug.c
: small fixes
- BSDI related bug fix in defs.h
- small changes in Makefile
- RSRR support for
(*,G)
completed - BSDI 3.0/3.1 support by Hitoshi Asaeda [email protected] (the kernel patches will be available soon)
- Improved debug messages format, thanks to Hitoshi Asaeda
- A new function
netname()
for network IP address print instead ofinet_fmts()
, thanks to Hitoshi Asaeda. pimd.conf
: format changed
- Remove inherited leaves from (S,G) when a receiver drops membership
- some parameters when calling
change_interface()
fixed - Use
send_pim_null_register
+ take the appropriate action when the register suppression timer expires - bug fix related to choosing the largest local IP address for little endian machines.
main.c:main()
: startup message fixtimer.c:age_routes()
: bug fix in debug code
- Minor changes, so pimd now compiles for SunOS 4.1.3 (cc, gcc)
pim_proto.csend_periodic_pim_join_prune()
: bug fix thanks to SunOS cc warning(!), only affects the(*,*,RP)
stuff.pimd.conf
: two errors, related to the rate limit fixed
Makefile
: cleanupdefs.h
: cleanuproutesock.c
: cleanup
igmp_proto.c:accept_group_report()
: bug fixespim_proto.c:receive_pim_hello()
: bug fixesroute.c:change_interfaces()
: bug fixesrp.c
: bug fixes ininit_rp_and_bsr()
,add_cand_rp()
, andcreate_pim_bootstrap_message()
Makefile
: "make diff" code addeddebug.c
: debug output slightly changed
defs.h:*TIMEOUT()
: definitions fixedroute.c
: bugs fixed inchange_interface()
andswitch_shortest_path()
timer.c:age_routes()
: number of bugs fixed
First alpha version of the "new, up to date" pimd. RSRR and Solaris support added. Many functions rewritten and/or modified.