DirectIPLookup − Click element; IP routing lookup using direct-indexed tables
DirectIPLookup(ADDR1/MASK1 [GW1] OUT1, ADDR2/MASK2 [GW2] OUT2, ...)
any number of inputs, any number of outputs
Package: ip (core)
Expects a destination IP address annotation with each packet. Looks up that address in its routing table, using longest-prefix-match, sets the destination annotation to the corresponding GW (if specified), and emits the packet on the indicated OUTput port.
Each argument is a route, specifying a destination and mask, an optional gateway IP address, and an output port. No destination-mask pair should occur more than once.
DirectIPLookup is optimized for lookup speed at the expense of extensive RAM usage. Each longest-prefix lookup is accomplished in one to maximum two DRAM accesses, regardless on the number of routing table entries. Individual entries can be dynamically added to or removed from the routing table with relatively low CPU overhead, allowing for high update rates.
DirectIPLookup implements the DIR-24-8-BASIC lookup scheme described by Gupta, Lin, and McKeown in the paper cited below.
Outputs a human-readable version of the current routing table.
lookup read-only, requires (parameters)
Reports the OUTput port and GW corresponding to an address.
Adds a route to the table. Format should be ‘ADDR/MASK [GW] OUT’. Fails if a route for ADDR/MASK already exists.
Sets a route, whether or not a route for the same prefix already exists.
Removes a route from the table. Format should be ‘ADDR/MASK’.
Adds or removes a group of routes. Write ‘add/set ADDR/MASK [GW] OUT’ to add a route, and ‘remove ADDR/MASK’ to remove a route. You can supply multiple commands, one per line; all commands are executed as one atomic operation.
Clears the entire routing table in a single atomic operation.
See IPRouteTable(7) for a performance comparison of the various IP routing elements.
DirectIPLookup’s data structures are inherently limited: at most 2^15 /24 networks can contain routes for /25-or-smaller subnetworks, no matter how much memory you have. If you need more than this, try BSDIPLookup(7), DXRIPLookup(7) or RadixIPLookup(7).
IPRouteTable(7), BSDIPLookup(7), DXRIPLookup(7), RadixIPLookup(7), StaticIPLookup(7), LinearIPLookup(7), SortedIPLookup(7), LinuxIPLookup(7)
Pankaj Gupta, Steven Lin, and Nick McKeown. "Routing Lookups in Hardware at Memory Access Speeds". In Proc. IEEE Infocom 1998, Vol. 3, pp. 1240-1247.