There can be multiple primary addresses with different scopesand only the highest scope one has IA_PRIMARY set, so reportthe remaining ones as "Unselected".
Yet another nasty bugfix of iface_patts_equal().
Bugfix in iface_patts_equal.When both patterns were NULL strcmp it sigfaulted.
Avoid sentence containing a colon to start new doc subsection.
#ifdef out lots of debugging information.
The long resource/routing table dump printed upon startup is gone nowand if you wish to see it, just send bird SIGUSR1 or use the `debug'commands.
Removed a lot of unused variables.
Please try compiling your code with --enable-warnings to see them. (Theunused parameter warnings are usually bogus, the unused variable onesare very useful, but gcc is unable to control them separately.)
IPv6 address classification fixes.
Fix stupid bug in neighbor cache.
Great cleanup of debug messages. LOCAL_DEBUG turned off in most modules,several debug() calls converted to DBG.
Added tracing of interface events.
Reimplemented neighbor cache. Now uses real hashing.
Rewrote interface type detection logic. The `unnumbered' flag is now peraddress, not per interface (hence it's ifa->flags & IA_UNNUMBERED) andshould be set reliably. IF_MULTIACCESS should be fixed now, but it isn'twise to rely on it on interfaces configured with /30 prefix.
Killed a couple of bugs in the neighbor cache.
Manual disable/enable/restart/shutdown/reconfiguration of protocolsno longer hangs on loops in neighbor lists :)
Reworked proto lists -- each proto is now in two lists: the global one(proto_list) and per-type one (original lists). A lot of things simplified.
Implemented `disable', `enable' and `restart' CLI commands.
Introduced new protocol-dependent integer field `aux' to struct neighbor.
`show interfaces' and `show protocols' works.
Added few basic commands: show status, show interfaces [summary],show protocols (incomplete).
Basic support for IPv6. The system-dependent part doesn't work yet,but the core routines are there and seem to be working.
o lib/ipv6.[ch] written o Lexical analyser recognizes IPv6 addresses and when in IPv6 mode, treats pure IPv4 addresses as router IDs....
Cleaned up handling of interface patterns:
o Parsing of interface patterns moved to generic code, introduced this_ipatt which works similarly to this_iface. o Interface patterns now support selection by both interface names and primary IP addresses....
Netlink support for secondary interface addresses.
I rewrote the interface handling code, so that it supports multipleaddresses per interface (needed for example for IPv6 support).
o struct iface now contains a list of all interface addresses (represented by struct ifa), iface->addr points to the primary address (if any)....
Don't try to manipulate neighbor lists for copied interface structures.This avoids few nasty references to free memory.
o The if_change_too_big_p change was too high-spirited. Fixed.o Introduced if_find_by_index()o Recognizing two types of interface updates: full update (starting with if_start_update(), ending with if_end_update(), guaranteed to see all existing interfaces) and a partial update (only if_update(),...
Interface logic changes:
o Introduced IF_LINK_UP flag corresponding to real link state.o Allowed addressless interfaces.o IF_UP is now automatically calculated and set iff the interface is administratively up, has link up and has an IP address assigned....
Parameter order for the proto->if_notify hook was different in the includefile and different in reality. Decided to use the same order as we dofor proto->rt_notify (i.e., first new value and second the old one).
Don't send any neighbor notifications to protocols being flushed.
When protocols go down, prune the neighbor list.
config->router_id works again.
struct proto again contains instance name (a copy of proto->cf->name).
Implemented new configuration/reconfiguration interface and defined protocolstate machines. Full explanation will follow soon.
die() -> bug() where appropriate.
Aesthetic fix for neighbor cache debug dump.
Added functions for manipulating interface name pattern lists:
o iface_patt_match(list, iface) -- match interface against list o iface_patts_equal(a, b, c) -- compare whether two pattern lists are equal or not. c(x,y) is called for comparison of protocol-dependent...
Generate router_id automatically if possible (standard "smallest of localregular interface addresses" rule).
Protocols should NOT rely on router_id existence -- when router ID is notavailable, the router_id variable is set to zero and protocols requiring...
Solve chicken-and-egg problems with protocol startup. We now queue all inactiveprotocols and don't send route/interface updates to them and when they come up,we resend the whole route/interface tables privately.
Removed the "scan interface list after protocol start" work-around.
Use '%I' instead of dirty address printing hacks.
Now sending IF_CHANGE_CREATE when a new interface appears and IF_CHANGE_UPonly if it's really up.
Protocol hooks. All of them may be NULL.
- Rewrote whole interface logic. Removed support for multiple addresses per interface since it makes much trouble everywhere. Instead, we understand secondary addresses as subinterfaces.
- In case interface addresses or basic flags change, we simply convert it...
Implemented scanning of network interfaces. Mostly very ugly code due toterrible kernel interface (SIOGIFCONF and friends).