| Classes | 
 | ------- | 
 |  | 
 | 	"Class" is a complete routing table in common sense. | 
 | 	I.e. it is tree of nodes (destination prefix, tos, metric) | 
 | 	with attached information: gateway, device etc. | 
 | 	This tree is looked up as specified in RFC1812 5.2.4.3 | 
 | 	1. Basic match | 
 | 	2. Longest match | 
 | 	3. Weak TOS. | 
 | 	4. Metric. (should not be in kernel space, but they are) | 
 | 	5. Additional pruning rules. (not in kernel space). | 
 | 	 | 
 | 	We have two special type of nodes: | 
 | 	REJECT - abort route lookup and return an error value. | 
 | 	THROW  - abort route lookup in this class. | 
 |  | 
 |  | 
 | 	Currently the number of classes is limited to 255 | 
 | 	(0 is reserved for "not specified class") | 
 |  | 
 | 	Three classes are builtin: | 
 |  | 
 | 	RT_CLASS_LOCAL=255 - local interface addresses, | 
 | 	broadcasts, nat addresses. | 
 |  | 
 | 	RT_CLASS_MAIN=254  - all normal routes are put there | 
 | 	by default. | 
 |  | 
 | 	RT_CLASS_DEFAULT=253 - if ip_fib_model==1, then | 
 | 	normal default routes are put there, if ip_fib_model==2 | 
 | 	all gateway routes are put there. | 
 |  | 
 |  | 
 | Rules | 
 | ----- | 
 | 	Rule is a record of (src prefix, src interface, tos, dst prefix) | 
 | 	with attached information. | 
 |  | 
 | 	Rule types: | 
 | 	RTP_ROUTE - lookup in attached class | 
 | 	RTP_NAT   - lookup in attached class and if a match is found, | 
 | 		    translate packet source address. | 
 | 	RTP_MASQUERADE - lookup in attached class and if a match is found, | 
 | 		    masquerade packet as sourced by us. | 
 | 	RTP_DROP   - silently drop the packet. | 
 | 	RTP_REJECT - drop the packet and send ICMP NET UNREACHABLE. | 
 | 	RTP_PROHIBIT - drop the packet and send ICMP COMM. ADM. PROHIBITED. | 
 |  | 
 | 	Rule flags: | 
 | 	RTRF_LOG - log route creations. | 
 | 	RTRF_VALVE - One way route (used with masquerading) | 
 |  | 
 | Default setup: | 
 |  | 
 | root@amber:/pub/ip-routing # iproute -r | 
 | Kernel routing policy rules | 
 | Pref Source             Destination        TOS Iface   Cl | 
 |    0 default            default            00  *       255 | 
 |  254 default            default            00  *       254 | 
 |  255 default            default            00  *       253 | 
 |  | 
 |  | 
 | Lookup algorithm | 
 | ---------------- | 
 |  | 
 | 	We scan rules list, and if a rule is matched, apply it. | 
 | 	If a route is found, return it. | 
 | 	If it is not found or a THROW node was matched, continue | 
 | 	to scan rules. | 
 |  | 
 | Applications | 
 | ------------ | 
 |  | 
 | 1.	Just ignore classes. All the routes are put into MAIN class | 
 | 	(and/or into DEFAULT class). | 
 |  | 
 | 	HOWTO:  iproute add PREFIX [ tos TOS ] [ gw GW ] [ dev DEV ] | 
 | 		[ metric METRIC ] [ reject ] ... (look at iproute utility) | 
 |  | 
 | 		or use route utility from current net-tools. | 
 | 		 | 
 | 2.	Opposite case. Just forget all that you know about routing | 
 | 	tables. Every rule is supplied with its own gateway, device | 
 | 	info. record. This approach is not appropriate for automated | 
 | 	route maintenance, but it is ideal for manual configuration. | 
 |  | 
 | 	HOWTO:  iproute addrule [ from PREFIX ] [ to PREFIX ] [ tos TOS ] | 
 | 		[ dev INPUTDEV] [ pref PREFERENCE ] route [ gw GATEWAY ] | 
 | 		[ dev OUTDEV ] ..... | 
 |  | 
 | 	Warning: As of now the size of the routing table in this | 
 | 	approach is limited to 256. If someone likes this model, I'll | 
 | 	relax this limitation. | 
 |  | 
 | 3.	OSPF classes (see RFC1583, RFC1812 E.3.3) | 
 | 	Very clean, stable and robust algorithm for OSPF routing | 
 | 	domains. Unfortunately, it is not widely used in the Internet. | 
 |  | 
 | 	Proposed setup: | 
 | 	255 local addresses | 
 | 	254 interface routes | 
 | 	253 ASE routes with external metric | 
 | 	252 ASE routes with internal metric | 
 | 	251 inter-area routes | 
 | 	250 intra-area routes for 1st area | 
 | 	249 intra-area routes for 2nd area | 
 | 	etc. | 
 | 	 | 
 | 	Rules: | 
 | 	iproute addrule class 253 | 
 | 	iproute addrule class 252 | 
 | 	iproute addrule class 251 | 
 | 	iproute addrule to a-prefix-for-1st-area class 250 | 
 | 	iproute addrule to another-prefix-for-1st-area class 250 | 
 | 	... | 
 | 	iproute addrule to a-prefix-for-2nd-area class 249 | 
 | 	... | 
 |  | 
 | 	Area classes must be terminated with reject record. | 
 | 	iproute add default reject class 250 | 
 | 	iproute add default reject class 249 | 
 | 	... | 
 |  | 
 | 4.	The Variant Router Requirements Algorithm (RFC1812 E.3.2) | 
 | 	Create 16 classes for different TOS values. | 
 | 	It is a funny, but pretty useless algorithm. | 
 | 	I listed it just to show the power of new routing code. | 
 |  | 
 | 5.	All the variety of combinations...... | 
 |  | 
 |  | 
 | GATED | 
 | ----- | 
 |  | 
 | 	Gated does not understand classes, but it will work | 
 | 	happily in MAIN+DEFAULT. All policy routes can be set | 
 | 	and maintained manually. | 
 |  | 
 | IMPORTANT NOTE | 
 | -------------- | 
 | 	route.c has a compilation time switch CONFIG_IP_LOCAL_RT_POLICY. | 
 | 	If it is set, locally originated packets are routed | 
 | 	using all the policy list. This is not very convenient and | 
 | 	pretty ambiguous when used with NAT and masquerading. | 
 | 	I set it to FALSE by default. | 
 |  | 
 |  | 
 | Alexey Kuznetov | 
 | kuznet@ms2.inr.ac.ru |