<?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>#blogdump &#187; c</title>
	<atom:link href="http://aandre.evolix.net/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://aandre.evolix.net</link>
	<description>geeky lines</description>
	<lastBuildDate>Wed, 17 Jun 2009 15:43:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>container_of</title>
		<link>http://aandre.evolix.net/2009/06/02/container_of/</link>
		<comments>http://aandre.evolix.net/2009/06/02/container_of/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:56:47 +0000</pubDate>
		<dc:creator>arno</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[magic macro]]></category>

		<guid isPermaLink="false">http://aandre.evolix.net/?p=274</guid>
		<description><![CDATA[container_of est une macro très utile et définie dans le kernel linux (./include/linux/kernel.h), qui permet de récupérer l&#8217;adresse d&#8217;une structure à partir d&#8217;un de ses membres:

/*!
* container_of - cast a member of a descriptor out to the containing descriptor
*
* @ptr:    the pointer to the member.
* @type:    the type of [...]]]></description>
			<content:encoded><![CDATA[<p><strong>container_of</strong> est une macro très utile et définie dans le kernel linux (<em>./include/linux/kernel.h</em>), qui permet de récupérer l&#8217;adresse d&#8217;une structure à partir d&#8217;un de ses membres:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*!
* container_of - cast a member of a descriptor out to the containing descriptor
*
* @ptr:    the pointer to the member.
* @type:    the type of the container struct this is embedded in.
* @member:    the name of the member within the struct.
*
*/</span>
<span style="color: #339933;">#define container_of(ptr, type, member) ({			\</span>
<span style="color: #993333;">const</span> typeof<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>type <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>member <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>__mptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	\
<span style="color: #009900;">&#40;</span>type <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>__mptr <span style="color: #339933;">-</span> offsetof<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span>member<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Elle prend en paramètres (comme décrit plus haut):</p>
<ul>
<li><strong>ptr</strong>: le pointeur que nous manipulons, membre de la structure instanciée dont nous voulons récupérer l&#8217;adresse</li>
<li><strong>type</strong>: le type de la structure qui contient ce membre,</li>
<li><strong>member</strong>: le nom du membre dans la déclaration de la structure.</li>
</ul>
<p>La premiere ligne de la macro permet de déclarer un pointeur qui va contenir l&#8217;adresse du membre.</p>
<p>Ce pointeur va être correctement déclaré grâce au cast réalisé par:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">typeof<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>type <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>member <span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span></pre></div></div>

<p>(type *) 0 permet de déclarer un pointeur de structure de type (type) à l&#8217;adresse <strong>0</strong>. On récupère alors le membre qui nous intéresse et plus précisément son type avec <strong>typeof</strong>, opérateur unaire comme <strong>sizeof</strong> défini par <strong>gcc</strong> (<a title="Typeof" href="http://gcc.gnu.org/onlinedocs/gcc/Typeof.html" target="_self">http://gcc.gnu.org/onlinedocs/gcc/Typeof.html</a>).</p>
<p>La deuxième ligne peut se décomposer en deux parties:</p>
<p><span id="more-274"></span></p>
<ul>
<li>offsetof(type, member) va calculer le décalage du champ <strong>member</strong> à partir du début de la structure <strong>type</strong>, en octet. <strong>offsetof (3)</strong> est une macro définie dans <em>stddef.h</em>,</li>
<li>on soustrait à l&#8217;adresse contenue par <strong>__mptr</strong> l&#8217;offset calculé par offsetof. On caste <strong>__mptr</strong> en <em>(char *)</em> afin que la soustraction soit effectuée en octet (sinon le compilateur fixera comme unité la taille du membre <strong>member</strong>).</li>
</ul>
<p>L&#8217;adresse retournée est donc l&#8217;adresse de la structure contenant le membre <strong>ptr</strong>.</p>
<p>Prenons un exemple:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> toto <span style="color: #009900;">&#123;</span>
<span style="color: #993333;">char</span> a<span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>À un instant t dans mon code, je manipule un pointeur sur le membre <strong>b</strong> d&#8217;une structure <strong>toto</strong> instanciée préalablement en mémoire: <strong>(char *)ptr_sur_b</strong>;<br />
Je n&#8217;ai plus dans le contexte de la fonction l&#8217;adresse de cette structure et pour une raison quelconque (par exemple accéder au membre a) je veux récupérer cette adresse:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> toto <span style="color: #339933;">*</span>t<span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* je récupère l'adresse de la structure grâce à containerof */</span>
t <span style="color: #339933;">=</span> containerof<span style="color: #009900;">&#40;</span>ptr_sur_b<span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> toto<span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #808080; font-style: italic;">/* je peux alors accéder au membre a de la structure t: t-&gt;a */</span></pre></div></div>

<p>Si l&#8217;on remplace <strong>member</strong> et <strong>type</strong> dans la macro par ce qui nous intéresse ici:</p>
<p>ligne 1:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">const</span> typeof<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>type <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>member <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>__mptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">=&gt;</span> <span style="color: #993333;">const</span> typeof <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> toto<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>b <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>__mptr<span style="color: #339933;">;</span>
<span style="color: #339933;">=&gt;</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>__mptr<span style="color: #339933;">;</span></pre></div></div>

<p>ligne 2:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> toto <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>__mptr <span style="color: #339933;">-</span> offsetof <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> toto<span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> toto <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> __mptr <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>On retrouvera entre autre l&#8217;utilisation de cette macro dans l&#8217;implémentation des listes (<em>./include/linux/list.h</em>) du kernel.</p>
]]></content:encoded>
			<wfw:commentRss>http://aandre.evolix.net/2009/06/02/container_of/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VRRP et Linux, un peu de bricolage&#8230;</title>
		<link>http://aandre.evolix.net/2009/04/08/vrrp-et-linux-un-peu-de-bricolage/</link>
		<comments>http://aandre.evolix.net/2009/04/08/vrrp-et-linux-un-peu-de-bricolage/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 13:05:37 +0000</pubDate>
		<dc:creator>arno</dc:creator>
				<category><![CDATA[vrrp]]></category>
		<category><![CDATA[arp]]></category>
		<category><![CDATA[bridge]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[ebtables]]></category>
		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://aandre.evolix.net/?p=142</guid>
		<description><![CDATA[On reprend l&#8217;article précédent en mettant un peu les mains dans le camboui.
Un petit patch
Un patch (peut-être pas très propre ni très abouti) est disponible ici http://aandre.evolix.net/files/vrrpd/vrrpd-1.0-ebtables.diff. Il permet d&#8217;utiliser la méthode décrite précédemment tout en améliorant l&#8217;affichage du statut de vrrpd pendant son exécution.
Le script /etc/vrrpd/vrrp_switch sera exécuté lors des changements d&#8217;états avec des [...]]]></description>
			<content:encoded><![CDATA[<p>On reprend <a title="VRRP et Linux" href="http://aandre.evolix.net/?p=8" target="_self">l&#8217;article précédent</a> en mettant un peu les mains dans le camboui.</p>
<p><strong>Un petit patch</strong></p>
<p>Un patch (peut-être pas très propre ni très abouti) est disponible ici <a title="vrrpd-1.0-ebtables.diff" href="http://aandre.evolix.net/files/vrrpd/vrrpd-1.0-ebtables.diff">http://aandre.evolix.net/files/vrrpd/vrrpd-1.0-ebtables.diff</a>. Il permet d&#8217;utiliser la méthode décrite précédemment tout en améliorant l&#8217;affichage du statut de vrrpd pendant son exécution.</p>
<p>Le script <em>/etc/vrrpd/vrrp_switch</em> sera exécuté lors des changements d&#8217;états avec des arguments supplémentaires:</p>
<ul>
<li>l&#8217;IP virtuelle VRRP,</li>
<li>l&#8217;interface sur laquelle l&#8217;instance VRRP tourne,</li>
<li>la priorité actuelle de l&#8217;instance,</li>
<li>l&#8217;advertisement interval VRRP</li>
<li>la preemption VRRP</li>
</ul>
<p><span id="more-142"></span></p>
<p>On récupère aussi l&#8217;adresse mac matérielle de l&#8217;interface du routeur, et l&#8217;adresse mac VRRP.</p>
<p>On va ainsi logger plus d&#8217;information sur l&#8217;état de notre routeur VRRP dans <em>/var/vrrp/vrrp-$VRRP_NAME</em>, mais surtout on aura à disposition les paramètres nécessaires pour le bon fonctionnement de nos règles ebtables gérant les états <em>master</em> et <em>slave</em>.</p>
<p>Il est prévu d&#8217;utiliser vrrpd avec l&#8217;option <em>-n</em> afin que ce dernier n&#8217;ait pas à gérer l&#8217;adresse mac virtuelle. Néanmoins cela entraîne aussi l&#8217;envoi des paquets d&#8217;échanges VRRP avec l&#8217;adresse mac matérielle. Le patch corrige cela.</p>
<p>On télécharge les sources de vrrpd ici <a title="vrrpd_1.0-1exp1.tar.gz" href="http://ftp.de.debian.org/debian/pool/main/v/vrrpd/vrrpd_1.0-1exp1.tar.gz">http://ftp.de.debian.org/debian/pool/main/v/vrrpd/vrrpd_1.0-1exp1.tar.gz</a></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ wget http://ftp.de.debian.org/debian/pool/main/v/vrrpd/vrrpd_1.0-1exp1.tar.gz
$ tar zxvf vrrpd_1.0-1exp1.tar.gz</pre></div></div>

<p>On applique le patch et on compile:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ wget http://aandre.evolix.net/files/vrrpd/vrrpd-1.0-ebtables.diff
$ cd vrrpd-1.0 &amp;&amp; patch -p1 &lt; ../vrrpd-1.0-ebtables.diff
$ make</pre></div></div>

<p>On prépare l&#8217;environnement de vrrpd à la main:</p>
<p>En root</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mkdir /etc/vrrpd &amp;&amp; cp debian/vrrp_switch /etc/vrrp
# mkdir /var/vrrp</pre></div></div>

<p>Voilà on est prêt à tester vrrpd, en utilisant la topologie classique suivante :</p>
<div id="attachment_147" class="wp-caption aligncenter" style="width: 318px"><a rel="attachment wp-att-147" href="http://aandre.evolix.net/2009/04/08/vrrp-et-linux-un-peu-de-bricolage/vrrp_exemple1/"><img class="size-full wp-image-147" title="vrrp_exemple1" src="http://aandre.evolix.net/wp-content/vrrp_exemple1.png" alt="VRRP demo" width="308" height="257" /></a><p class="wp-caption-text">VRRP demo</p></div>
<p>Dans cet article on se contentera de tester la bascule VRRP en pingant continuellement l&#8217;adresse ip virtuelle et on regardera si les adresses MAC sont correctes dans /proc/net/arp de la machine &#8220;client&#8221;.</p>
<p><strong>Côté Cisco 800</strong></p>
<p>On configure une instance VRRP avec un group ID de 10, une priorité de 110, un advertisement interval de 2s et l&#8217;adresse IP virtuelle 192.168.10.250, sur l&#8217;interface configurée avec l&#8217;adresse 192.168.10.2/24 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">conf t
interface bla
vrrp 10 ip 192.168.10.250
vrrp 10 priority 110
vrrp 10 timers advertise 2</pre></div></div>

<p><strong>Côté Linux</strong></p>
<p>On prépare le bridge en y ajoutant la ou les interfaces que l&#8217;on souhaite, ici eth0.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># brctl addbr br0
# ifconfig eth0 up
# brctl addif br0 eth0
# ifconfig br0 192.168.10.3</pre></div></div>

<p>On lance vrrpd sur cette interface avec une priorité de 90 (donc backup par rapport au cisco).</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ./vrrpd -n -i br0 -v 10 -p 90 -d 2 -l demo 192.168.10.250 -D</pre></div></div>

<p>L&#8217;état de la machine faisant tourner vrrpd est bien slave :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cat /var/vrrp/state.10
slave
# cat /var/vrrp/vrrp-demo
VRRP - demo
Group 10
State is slave
Virtual IP address is 192.168.10.250
Virtual MAC address is 00:00:5E:00:01:a
demo is running on br0
Priority is 90
Advertisement interval is 2
Preemption is true</pre></div></div>

<p><strong>Côté client</strong></p>
<p>On peut lancer un tcpdump sur l&#8217;interface 192.168.10.12.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># tcpdump -vvv -xx -i eth0 -n vrrp
&nbsp;
11:12:09.311568 IP (tos 0xc0, ttl 255, id 0, offset 0, flags [none], proto VRRP (112), length 40)
192.168.10.2 &gt; 224.0.0.18: VRRPv2, Advertisement, vrid 10, prio 110, authtype none, intvl 2s, length 20, addrs: 192.168.10.250
0x0000:  0100 5e00 0012 0000 5e00 010a 0800 45c0
0x0010:  0028 0000 0000 ff70 0fe9 c0a8 0a02 e000
0x0020:  0012 210a 6e01 0002 a54f c0a8 0afa 0000
0x0030:  0000 0000 0000 0000 0000 0000</pre></div></div>

<p>Et l&#8217;on voit défiler les paquets VRRP d&#8217;avertissement émis par le routeur master (le cisco 800) avec l&#8217;adresse mac virtuelle 0000 5e00 010a</p>
<p>Un coup d&#8217;oeil sur les résolutions arp à partir de la machine client:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ping -c 1 192.168.10.2
$ ping -c 1 192.168.10.3
$ ping -c 1 192.168.10.250
$ cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
192.168.10.2     0x1         0x6         00:1e:7a:93:6f:21     *        eth0
192.168.10.3     0x1         0x2         00:13:72:76:23:aa     *        eth0
192.168.10.250   0x1         0x2         00:00:5e:00:01:0a     *        eth0</pre></div></div>

<p>Les deux routeurs sont toujours accessibles sur leur ip réelles avec les adresse mac matérielles correspondantes. La VMAC de l&#8217;instance VRRP est bien associée à 192.168.10.250.</p>
<p>Simulons grossièrement une &#8220;panne&#8221; du master en débranchant le cisco du lan et en pingant continuellement la VIP à partir du client:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ping 192.168.10.250
[...]
64 bytes from 192.168.10.250: icmp_seq=108 ttl=255 time=0.972 ms
64 bytes from 192.168.10.250: icmp_seq=109 ttl=255 time=0.959 ms
64 bytes from 192.168.10.250: icmp_seq=117 ttl=64 time=0.195 ms
64 bytes from 192.168.10.250: icmp_seq=118 ttl=64 time=0.171 ms
[...]</pre></div></div>

<p>La convergence vers le nouveau master s&#8217;est faite en quelques secondes, on l&#8217;observe sur le ping (ah regardez la ttl par exemple et /proc/sys/net/ipv4/ip_default_ttl sur la machine faisant tourner vrrpd&#8230;).</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /var/vrrp/state.10
master
$ cat /var/vrrp/vrrp-demo
VRRP - demo
Group 10
State is master
Virtual IP address is 192.168.10.250
Virtual MAC address is 00:00:5E:00:01:a
vrrpd- is running on br0
Priority is 90
Advertisement interval is 2
Preemption is true</pre></div></div>

<p>Dans notre tcpdump, on voit que c&#8217;est vrrpd qui génère à présent les avertissements VRRP.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">11:43:51.714625 IP (tos 0x0, ttl 255, id 256, offset 0, flags [none], proto VRRP (112), length 40)
192.168.10.3 &gt; 224.0.0.18: VRRPv2, Advertisement, vrid 10, prio 90, authtype none, intvl 2s, length 20, addrs: 192.168.10.250
0x0000:  0100 5e00 0012 0000 5e00 010a 0800 4500
0x0010:  0028 0100 0000 ff70 0fa8 c0a8 0a03 e000
0x0020:  0012 210a 5a01 0002 b94f c0a8 0afa 0000
0x0030:  0000 0000 0000 0000 0000 0000</pre></div></div>

<p>L&#8217;interface br0 s&#8217;est bien appropriée la VIP 192.168.10.250:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ip addr show br0
3: br0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 00:13:72:76:23:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.3/24 brd 192.168.10.255 scope global br0
    inet 192.168.10.250/32 brd 192.168.10.250 scope global br0</pre></div></div>

<p>Vérifions à nouveau les adresses mac</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ping -c 1 192.168.10.3
$ ping -c 1 192.168.10.250
$ cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
192.168.10.3     0x1         0x2         00:13:72:76:23:aa     *        eth0
192.168.10.250   0x1         0x2         00:00:5e:00:01:0a     *        eth0</pre></div></div>

<p>Tout est ok lorsque vrrpd est master.</p>
<p>On peut aussi vérifier les règles ebtables insérées lors du passage à l&#8217;état master :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">navi:/var/vrrp# ebtables -t broute -L
Bridge table: broute
&nbsp;
Bridge chain: BROUTING, entries: 1, policy: ACCEPT
-p IPv4 -d 0:0:5e:0:1:a --logical-in br0 -j redirect
navi:/var/vrrp# ebtables -L
Bridge table: filter
&nbsp;
Bridge chain: INPUT, entries: 0, policy: ACCEPT
&nbsp;
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
&nbsp;
Bridge chain: OUTPUT, entries: 1, policy: ACCEPT
-p ARP -s 0:13:72:76:23:aa --logical-out br0 --arp-op Reply --arp-ip-src 192.168.10.250 -j DROP
navi:/var/vrrp# ebtables -t nat -L
Bridge table: nat
&nbsp;
Bridge chain: PREROUTING, entries: 1, policy: ACCEPT
-p ARP --logical-in br0 --arp-op Request --arp-htype 1 --arp-ptype IPv4 --arp-ip-dst 192.168.10.250 -j arpreply --arpreply-mac 0:0:5e:0:1:a --arpreply-target ACCEPT
&nbsp;
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
&nbsp;
Bridge chain: POSTROUTING, entries: 1, policy: ACCEPT
-p IPv4 --logical-out br0 --ip-src 192.168.10.250 -j snat --to-src 0:0:5e:0:1:a --snat-target ACCEPT</pre></div></div>

<p><strong> Conclusion</strong></p>
<p>L&#8217;exemple porte sur une seule instance de VRRP, mais il sera possible d&#8217;en lancer plusieurs en parallèle sur la mêmes interfaces et conserver la même cohérence.</p>
<p>Un autre sujet intéressant sur vrrpd pourrait concerner la fonctionnalité de tracking d&#8217;interface, qui prend tout son sens dans le cas par exemple d&#8217;un backup de ligne adsl. Néanmoins le code en l&#8217;état ne permet pas de l&#8217;utiliser sur <em>ppp0</em> (cf les fonctions monitorit() l.1984 et mido_read() l.2005).</p>
]]></content:encoded>
			<wfw:commentRss>http://aandre.evolix.net/2009/04/08/vrrp-et-linux-un-peu-de-bricolage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
