<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Calin Velea - Homepage</title>
	<atom:link href="http://vcalinus.gemenii.ro/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://vcalinus.gemenii.ro</link>
	<description>vcalinus.gemenii.ro - Useful stuff</description>
	<lastBuildDate>Sun, 05 Apr 2009 01:20:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Fast u32 hashing filter generator</title>
		<link>http://vcalinus.gemenii.ro/?p=9</link>
		<comments>http://vcalinus.gemenii.ro/?p=9#comments</comments>
		<pubDate>Sat, 04 Apr 2009 22:05:57 +0000</pubDate>
		<dc:creator>vcalinus</dc:creator>
				<category><![CDATA[QOS]]></category>
		<category><![CDATA[htb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[u32]]></category>

		<guid isPermaLink="false">http://vcalinus.gemenii.ro/wp2/wordpress/?p=9</guid>
		<description><![CDATA[Download prefixtree.c Description A small C program that generates very fast u32 hashing filters given a random set of prefixes and destination class ids as input. The resulting filters can be appended to a file containing the htb class definitions to create a complete tc input file. The program generates a tree of u32 hash [...]]]></description>
			<content:encoded><![CDATA[<p><!--<br />
pre {font-family: sans-serif; color: #9000A1;}<br />
--></p>
<h3 class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Download</span></strong></h3>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><a href="http://vcalinus.gemenii.ro/prefixtree.c">prefixtree.c</a></span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<h3 class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Description</span></strong></h3>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><span lang="EN-US">A small C program that generates very fast u32 hashing filters given a random set of prefixes and destination class ids as input. The resulting filters can be appended to a file containing the htb class definitions to create a complete tc input file.</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><span lang="EN-US">The program generates a tree of u32 hash tables. The root table contains entries for the first byte in the IPv4 address. Each entry contains hash tables for the second byte, whose entries in turn contain hash tables for the third and so on. Only entries used in the prefixes supplied are generated.<span> </span></span></p>
<p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><span lang="EN-US">This way, regardless of the IP address, classifying a packet into a class needs a fixed number of operations (the maximum tree depth is 4). At constant traffic levels, increasing the number of prefixes will only increase the used memory. CPU usage should remain fairly the same.</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<h3 class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Compile/run instructions</span></strong></h3>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US">
</span>root@br1 [/home/vcalinus]# <span lang="EN-US">gcc -o prefixtree prefixtree.c</span></pre>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre>root@br1 [/home/vcalinus]# ./prefixtree
IPv4 u32 hash filter generator - (C) 2006 Calin Velea</pre>
<pre>Syntax: prefixtree {prefix.in} {u32filters.out} {interface} {src/dst} [batch]</pre>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;">
<p class="MsoNormal" style="text-align: justify;"><strong>Arguments</strong></p>
<ul>
<li><span lang="EN-US">{prefix.in} – input file. Contains the list of prefixes and the associated class ids in the following format:</span></li>
</ul>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US">&lt;prefix&gt; &lt;classid&gt;</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US">&#8230;.</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><br />
</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<ul>
<li><span lang="EN-US">{u32filters.out} &#8211; output file. Contains the generated u32 hash filters<br />
</span></li>
</ul>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<ul>
<li><span lang="EN-US">{interface} &#8211; interface where the shaping takes place (tc filter add dev {interface} )</span></li>
</ul>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<ul>
<li><span lang="EN-US">{src/dst} – indicates whether we are shaping upload or download (affects<span> </span>src/dst and hash offsets in tc statements)</span></li>
</ul>
<ul>
<li><span lang="EN-US">[batch] – if specified, will generate an output file acceptable for tc -b</span></li>
</ul>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<h3 class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Typical usage example</span></strong></h3>
<p><strong><span lang="EN-US"><br />
</span></strong></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><strong>tc.main.src</strong> &#8211; base tc file<br />
</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US">qdisc add dev eth0 root handle 1: htb default 99 r2q 1
class add dev eth0 parent 1: classid 1:1 htb rate 400000kbit ceil 400000kbit quantum 1536</span><span lang="EN-US">
</span><span lang="EN-US">
#default</span><span lang="EN-US">
class add dev eth0 parent 1:1 classid 1:99 htb rate 100kbit ceil 100kbit
qdisc add dev eth0 parent 1:99 handle 99: sfq quantum 1520 perturb 10
</span></pre>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US"># cust1 – class 1:101</span><span lang="EN-US">
class add dev eth0 parent 1:1 classid 1:101 htb rate 10120kbit ceil 10120kbit quantum 1536<span>
</span>qdisc add dev eth0 parent 1:101 handle 101: sfq quantum 1520 perturb 10
</span><span lang="EN-US">
# cust2 – class 1:102<span>
</span>class add dev eth0 parent 1:1 classid 1:102 htb rate 20096kbit ceil 20096kbit quantum 1536
qdisc add dev eth0 parent 1:102 handle 102: sfq quantum 1520 perturb 10</span><span lang="EN-US">
</span><span lang="EN-US">
# cust3 – class 1:1af<span>
</span>class add dev eth0 parent 1:1 classid 1:1af htb rate 20096kbit ceil 20096kbit quantum 1536<span>
</span>qdisc add dev eth0 parent 1:1af handle 1af: sfq quantum 1520 perturb 10</span></pre>
<p class="MsoNormal" style="text-align: justify;"><em><span lang="EN-US"><br />
</span></em></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><strong>prefixes.in</strong> &#8211; input file for prefixtree<br />
</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US">68.91.0.0/20 <span> </span>   1:101</span><span lang="EN-US">
195.28.184.0/29 <span> </span>1:102
89.165.145.5/32 <span> </span>1:1af</span></pre>
<p class="MsoNormal" style="text-align: justify;"><em><span lang="EN-US"><br />
</span></em></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Run it:</span></strong></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre class="MsoNormal" style="text-align: justify;">root@br1 [/home/vcalinus]#<span lang="EN-US"> ./prefixtree prefixes.in u32filters.out eth0 src batch
lines parsed: 3
total hashtables: 8</span></pre>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;">
<p class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Output file:</span></strong></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre>root@br1 [/home/vcalinus]# cat u32filters.out

##### Generated with prefixtree v1.0 #####

filter add dev eth0 parent 1:0 prio 5 protocol ip u32
filter add dev eth0 parent 1:0 prio 5 handle 10: protocol ip u32 divisor 256
filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 800:: match ip src 0.0.0.0/0 hashkey mask 0xff000000 at 12 link 10:

## entries for 68.0.0.0/8

filter add dev eth0 parent 1:0 prio 5 handle 11: protocol ip u32 divisor 256
filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 10:44:  match ip src 0.0.0.0/0 hashkey mask 0xff0000 at 12 link 11:

## entries for 68.91.0.0/16

     filter add dev eth0 parent 1:0 prio 5 handle 12: protocol ip u32 divisor 256
     filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 11:5b:  match ip src 0.0.0.0/0 hashkey mask 0xff00 at 12 link 12:

         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:0:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:1:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:2:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:3:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:4:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:5:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:6:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:7:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:8:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:9:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:a:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:b:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:c:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:d:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:e:  match ip src 0.0.0.0/0 flowid 1:101
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 12:f:  match ip src 0.0.0.0/0 flowid 1:101

## entries for 89.0.0.0/8

filter add dev eth0 parent 1:0 prio 5 handle 16: protocol ip u32 divisor 256
filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 10:59:  match ip src 0.0.0.0/0 hashkey mask 0xff0000 at 12 link 16:

## entries for 89.165.0.0/16

     filter add dev eth0 parent 1:0 prio 5 handle 17: protocol ip u32 divisor 256
     filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 16:a5:  match ip src 0.0.0.0/0 hashkey mask 0xff00 at 12 link 17:

## entries for 89.165.145.0/24

         filter add dev eth0 parent 1:0 prio 5 handle 18: protocol ip u32 divisor 256
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 17:91:  match ip src 0.0.0.0/0 hashkey mask 0xff at 12 link 18:

               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 18:5:  match ip src 0.0.0.0/0 flowid 1:1af

## entries for 195.0.0.0/8

filter add dev eth0 parent 1:0 prio 5 handle 13: protocol ip u32 divisor 256
filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 10:c3:  match ip src 0.0.0.0/0 hashkey mask 0xff0000 at 12 link 13:

## entries for 195.28.0.0/16

     filter add dev eth0 parent 1:0 prio 5 handle 14: protocol ip u32 divisor 256
     filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 13:1c:  match ip src 0.0.0.0/0 hashkey mask 0xff00 at 12 link 14:

## entries for 195.28.184.0/24

         filter add dev eth0 parent 1:0 prio 5 handle 15: protocol ip u32 divisor 256
         filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 14:b8:  match ip src 0.0.0.0/0 hashkey mask 0xff at 12 link 15:

               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:0:  match ip src 0.0.0.0/0 flowid 1:102
               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:1:  match ip src 0.0.0.0/0 flowid 1:102
               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:2:  match ip src 0.0.0.0/0 flowid 1:102
               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:3:  match ip src 0.0.0.0/0 flowid 1:102
               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:4:  match ip src 0.0.0.0/0 flowid 1:102
               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:5:  match ip src 0.0.0.0/0 flowid 1:102
               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:6:  match ip src 0.0.0.0/0 flowid 1:102
               filter add dev eth0 protocol ip parent 1:0 prio 5 u32 ht 15:7:  match ip src 0.0.0.0/0 flowid 1:102

root@br1 [/home/vcalinus]#</pre>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Finishing up</span></strong></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> Put classes and filters together:</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US">cat<span> </span>u32filters.out &gt;&gt; tc.main.src</span></pre>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;">
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> Apply<span> </span>everything:</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US">tc –b &lt; tc.main.src</span></pre>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US">
</span></pre>
<p><span lang="EN-US">Repeat the steps above </span><span lang="EN-US">using <strong>dst</strong> when running prefixtree</span><span lang="EN-US"> to shape the download.<br />
</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"><br />
</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<h3 class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Optimizing existing tc files</span></strong></h3>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><span lang="EN-US">Suppose you have a tc file which is not using hashing. Classification is done only based on src/dst prefix match (no port or other specific u32 matches are used). You could easily optimize it by separating the classes and filters part, constructing an input file for prefixtree then joining it back with the classes part. You need to write a script to parse the files and extract the prefixes and class ids (from the tc statements).</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<pre class="MsoNormal" style="text-align: justify;"><span lang="EN-US">grep –v "tc filter add" unoptimized_tc.in &gt; classes.out

grep<span> </span>"tc filter add" unoptimized_tc.in &gt; unoptimized_filters.out

./generate_prefixtree_input classes.out unoptimized_filters.out prefixes.in

./prefixtree prefixes.in optimized_filters.out $iface src batch</span><span lang="EN-US">

cat optimized_filters_out &gt;&gt; classes.out

</span><span lang="EN-US">mv classes.out optimized_tc.in

tc –b &lt; optimized_tc.in

</span></pre>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<h3 class="MsoNormal" style="text-align: justify;"><strong><span lang="EN-US">Test Results</span></strong></h3>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><span lang="EN-US">Real-world testing has shown troughputs of 1300Mbps / 250.000 pps (aggregated in+out)  for a 2.6.20 linux shaping bridge on a quad-core Xeon X3210 (2.13GHz, 8M  L2 cache), 2GBs of RAM using Intel PCI Express Gigabit NICs.  At this traffic level, CPU utilization averages varied between 25 &#8211; 50 % for every core.  Almost 8.000 prefixes of various lengths were being shaped, with a roughly equal number of htb classes.</span></p>
<p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><span lang="EN-US">5000 series Xeons with 12MB of L2 cache, running at 3GHz or more should come close to 6-700.000 pps peak performance, saturating several gigabit interfaces.<br />
</span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-align: justify;"><span lang="EN-US"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://vcalinus.gemenii.ro/?feed=rss2&amp;p=9</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Traffic classification using BGP (a quagga+realms approach)</title>
		<link>http://vcalinus.gemenii.ro/?p=7</link>
		<comments>http://vcalinus.gemenii.ro/?p=7#comments</comments>
		<pubDate>Thu, 01 Jan 2009 21:46:20 +0000</pubDate>
		<dc:creator>vcalinus</dc:creator>
				<category><![CDATA[Routing]]></category>
		<category><![CDATA[bgp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[QOS]]></category>
		<category><![CDATA[realms]]></category>

		<guid isPermaLink="false">http://vcalinus.gemenii.ro/wp2/wordpress/?p=3</guid>
		<description><![CDATA[Realms patch &#8211; Quagga 0.98.6 Stable: quagga-0.98.6-realms.diff Development: quagga-0.99.5-realms.diff Updated versions (&#62;0.99.5) &#8211; http://linux.mantech.ro/quagga+realm_en.html This patch enables Linux route realms support in quagga 0.98.6 I started with Arcady Stepanov’s patch for zebra 0.93b http://win.mol.ru/penguin/zebra-hacks/, adapted it to quagga 0.98.4 interface and added some useful features. The following commands are supported: Route-map bgpd(config-route-map)# set realm &#60;1-255&#62; [...]]]></description>
			<content:encoded><![CDATA[<div class="post-bodycopy clearfix">
<h2>Realms patch &#8211; Quagga 0.98.6</h2>
<p><strong>Stable:</strong> <a href="../../../quagga-0.98.6-realms.diff"> quagga-0.98.6-realms.diff</a><br />
<strong>Development:</strong> <a href="../../../quagga-0.99.5-realms.diff">quagga-0.99.5-realms.diff</a><br />
<strong>Updated versions (&gt;0.99.5) </strong> &#8211; <a title="http://linux.mantech.ro/quagga+realm_en.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/linux.mantech.ro');" href="http://linux.mantech.ro/quagga+realm_en.html">http://linux.mantech.ro/quagga+realm_en.html</a></p>
<p>This patch enables Linux route realms support in quagga 0.98.6<br />
I started with Arcady Stepanov’s patch for zebra 0.93b <a onclick="javascript:pageTracker._trackPageview('/outbound/article/win.mol.ru');" href="http://win.mol.ru/penguin/zebra-hacks/">http://win.mol.ru/penguin/zebra-hacks/</a>, adapted it to quagga 0.98.4 interface and added some useful features.<br />
The following commands are supported:</p>
<ul>
<li>Route-map
<ul>
<li><strong> </strong>
<pre><strong>bgpd(config-route-map)# set realm
  &lt;1-255&gt;    Realm id for Linux FIB routes
  WORD       Realm name for Linux FIB routes
  origin-as  Use route origin AS as realm id
  peer-as    Use route peer AS as realm id</strong></pre>
<p><strong></strong></li>
<li><strong> </strong>
<pre><strong>bgpd(config-route-map)# no set realm
  &lt;0-255&gt;    Realm value
  WORD       Realm name
  origin-as  Origin AS - realm
  peer-as    Peer AS - realm
  &lt;cr&gt;</strong></pre>
<p><strong></strong></li>
</ul>
</li>
<li>Neighbor
<ul>
<li><strong> </strong>
<pre><strong>bgpd(config-router)# neighbor x.x.x.x realm
  &lt;0-255&gt;    default realm id
  WORD       default realm name
  origin-as  Set default realm to received route origin AS
  peer-as    Set default realm to peer AS</strong></pre>
<p><strong></strong></li>
<li><strong> </strong>
<pre><strong>bgpd(config-router)# no neighbor x.x.x.x realm
  &lt;0-255&gt;    default realm id
  WORD       default realm name
  origin-as  Set default realm to received route origin AS
  peer-as    Set default realm to peer AS
  &lt;cr&gt;</strong></pre>
<p><strong></strong></li>
</ul>
</li>
</ul>
<p><strong>Note:</strong></p>
<p>’set realm origin-as’ was added with inter-AS traffic accounting in mind. For now, this is possible only with the iptables realm match which can match on the full 16bit realm value. The current realm accounting code in the kernel (rtacct &#8211; /proc/net/rt_acct) supports only 256 values for realms, and displays incorrect statistics.</p>
<p><strong>Bugs/suggestions should go to: vcalinusATgemenii.ro</strong></p>
<h3>Brief usage guide…</h3>
<pre><strong>0. kernel support (if you want to classify traffic into htb classes using tc)</strong>

CONFIG_NET_CLS_ROUTE=y

<strong>1. /eetc/iproute2/rt_realms</strong>

Assign meaningful names to realm numbers...

user@router:/# cat /eetc/iproute2/rt_realms

10 localnet
20 metro-isp
22 metro-other
30 international

<strong>2. compile/install quagga</strong>

Stable Quagga 0.98.6
<a onclick="javascript:pageTracker._trackPageview('/outbound/article/ftp.iasi.roedu.net');" href="http://ftp.iasi.roedu.net/mirrors/quagga.net/download/quagga-0.98.6.tar.gz">quagga 0.98.6 - official release</a>
+
<a href="../../../quagga-0.98.6-realms.diff">quagga 0.98.6 realms patch</a>
Big thanks to Alin Nastac for updating the patch to 0.98.6!

Patch for development Quagga 0.99.5
<a href="../../../quagga-0.99.5-realms.diff">quagga-0.99.5-realms.diff</a>
<h5>Older patches</h5>

<a href="../../../quagga-0.98.5-realms.diff">quagga-0.98.5-realms.diff</a>
<a href="../../../quagga-0.98.4-realms.diff">quagga-0.98.4-realms.diff</a>
<a href="../../../quagga-0.98.3-realms.diff">quagga-0.98.3-realms.diff</a>

Remember to use  ./configure --enable-realms 

<strong>3. BGP CONFIGURATION</strong>
  a possible bgp setup:
  (if you hold the full routing table - replace defgw with a match on the desired community)
  AS-regexp match is also possible

 neighbor xxx.xxx.xxx.xxx remote-as XXXXX
 neighbor xxx.xxx.xxx.xxx soft-reconfiguration inbound
 neighbor xxx.xxx.xxx.xxx route-map isp_in in

ip prefix-list defgw seq 5 permit 0.0.0.0/0

ip community-list standard metro-isp permit XXXXX:comm1
ip community-list standard metro-other permit XXXXX:comm2

route-map isp_in permit 10
 match ip address prefix-list defgw
 set realm 30
!
route-map isp_in permit 20
 match community metro-isp
 set realm 20
!
route-map isp_in permit 30
 match community metro-other
 set realm 22
!
route-map isp_in permit 40

<strong>3.1 'ip route sh' will show kernel routes - they should have the realms specified in the route-map</strong>

something like....

62.217.192.0/18 via 193.19.192.65 dev eth1  proto zebra equalize realm 20
82.137.0.0/18 via 172.16.100.1 dev eth2  proto zebra equalize realm 22
84.243.64.0/18 via 172.16.100.1 dev eth2  proto zebra equalize realm 20
82.208.128.0/18 via 193.19.192.65 dev eth1  proto zebra equalize realm 22

<strong>4. iptables</strong>

Can be used in FORWARD or POSTROUTING (remember that realms are valid only after the forwarding decision)

Download: match default route, community 1, and community 2 sets

-A FORWARD -i eth3 -m realm --realm 0x1e0000/0xffff0000 -j sometarget...
-A FORWARD -i eth3 -m realm --realm 0x140000/0xffff0000 -j sometarget...
-A FORWARD -i eth3 -m realm --realm 0x160000/0xffff0000 -j sometarget...

Upload: match default route, community 1, and community 2 sets

-A FORWARD -o eth3 -m realm --realm 0x1e/0xffff -j sometarget...
-A FORWARD -o eth3 -m realm --realm 0x14/0xffff -j sometarget...
-A FORWARD -o eth3 -m realm --realm 0x16/0xffff -j sometarget...

(realms 30,20 and 22 are specified in hexadecimal)

<strong>5. tc</strong>

Excerpt from LARTC

# ip route add 192.168.2.0/24 dev eth2 realm 2
# tc filter add dev eth1 parent 1:0 protocol ip prio 100
  route from 2 classid 1:2

Here the filter specifies that packets from the subnetwork 192.168.2.0 (realm 2) will match class id 1:2.

You can also find useful QoS stuff at: <a onclick="javascript:pageTracker._trackPageview('/outbound/article/kernel.umbrella.ro');" href="http://kernel.umbrella.ro/net/">http://kernel.umbrella.ro/net/</a>

<strong>6. what are realms after all?</strong>

   Realms are 16bit integer values used to group routes into sets, according to
 some defined policy. Each route in the set will have the same realm.

   Each packet routed will have a 32bit integer value specifying a source and a destination realm. (they may be 0 - or unknown)
   On the leftmost 16bits you will find the source realm, on the rightmost 16bits the destination realm.
   More info: <a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.policyrouting.org');" href="http://www.policyrouting.org/iproute2.doc.html#ss9.9">http://www.policyrouting.org/iproute2.doc.html#ss9.9</a></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://vcalinus.gemenii.ro/?feed=rss2&amp;p=7</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
