<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Michele's Blog (Posts about tech)</title><link>http://acksyn.org/</link><description></description><atom:link href="http://acksyn.org/categories/tech.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Fri, 28 Nov 2025 09:30:42 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>TripleO on NUCs</title><link>http://acksyn.org/posts/2016/03/tripleo-on-nucs/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;&lt;a href="http://acksyn.org/images/nucs-small.png"&gt;&lt;img alt="nucs" src="http://acksyn.org/images/nucs-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Being a happy owner of a couple of Intel &lt;a href="http://www.intel.com/content/www/us/en/nuc/nuc-kit-dc53427hye-board-d53427rke.html"&gt;DC53427HYE NUCs&lt;/a&gt; NUCs, I decided I
would install &lt;a href="https://wiki.openstack.org/wiki/TripleO"&gt;TripleO&lt;/a&gt; on them.&lt;/p&gt;
&lt;p&gt;My setup consists of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Undercloud (nuc1.int.rhx) with two interfaces (the internal &lt;em&gt;eno1&lt;/em&gt; connected to my home LAN-&lt;em&gt;172.16.11.0/20&lt;/em&gt; and an additional USB-Ethernet dongle &lt;em&gt;enp0s29u1u5u1&lt;/em&gt; which is connected to a separate segment where the other two NUCs are connected-&lt;em&gt;192.0.2.0/24&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Two NUCs on which the AMT IP address has been configured as 192.0.2.100 (nuc2) and 192.0.2.101 (nuc3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I won't delve too much into the details of TripleO, see the official docs if you need more information: &lt;a href="http://tripleo.org/"&gt;http://tripleo.org/&lt;/a&gt;, but here are the steps I took after installing Centos 7.2 and applying this &lt;a href="http://acksyn.org/files/tripleo/nuc.patch"&gt;http://acksyn.org/files/tripleo/nuc.patch&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Steps&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;vim&lt;span class="w"&gt; &lt;/span&gt;tmux&lt;span class="w"&gt; &lt;/span&gt;wsmancli
cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/hosts&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 nuc1 nuc1.int.rhx&lt;/span&gt;
&lt;span class="s"&gt;::1         localhost localhost.localdomain localhost6 localhost6.localdomain6&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

useradd&lt;span class="w"&gt; &lt;/span&gt;stack
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"foobar"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;passwd&lt;span class="w"&gt; &lt;/span&gt;--stdin&lt;span class="w"&gt; &lt;/span&gt;stack
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stack ALL=(root) NOPASSWD:ALL"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/stack
sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0440&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/stack

su&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;stack
sudo&lt;span class="w"&gt; &lt;/span&gt;yum&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;epel-release&lt;span class="w"&gt;  &lt;/span&gt;yum-plugin-priorities&lt;span class="w"&gt; &lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;/etc/yum.repos.d/delorean.repo&lt;span class="w"&gt; &lt;/span&gt;http://trunk.rdoproject.org/centos7/current-tripleo/delorean.repo
sudo&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;/etc/yum.repos.d/delorean-current.repo&lt;span class="w"&gt; &lt;/span&gt;http://trunk.rdoproject.org/centos7/current/delorean.repo
sudo&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/\[delorean\]/\[delorean-current\]/'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/yum.repos.d/delorean-current.repo
sudo&lt;span class="w"&gt; &lt;/span&gt;/bin/bash&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cat &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt;/etc/yum.repos.d/delorean-current.repo&lt;/span&gt;
&lt;span class="s2"&gt;includepkgs=diskimage-builder,openstack-heat,instack,instack-undercloud,openstack-ironic,openstack-ironic-inspector,os-cloud-config,os-net-config,python-ironic-inspector-client,python-tripleoclient,tripleo-common,openstack-tripleo-heat-templates,openstack-tripleo-image-elements,openstack-tuskar-ui-extras,openstack-puppet-modules&lt;/span&gt;
&lt;span class="s2"&gt;EOF"&lt;/span&gt;

sudo&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;/etc/yum.repos.d/delorean-deps.repo&lt;span class="w"&gt; &lt;/span&gt;http://trunk.rdoproject.org/centos7/delorean-deps.repo
sudo&lt;span class="w"&gt; &lt;/span&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;python-tripleoclient

cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/undercloud.conf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="s"&gt;local_interface = enp0s29u1u5u1&lt;/span&gt;
&lt;span class="s"&gt;[auth]&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

openstack&lt;span class="w"&gt; &lt;/span&gt;undercloud&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;undercloud_install.log

&lt;span class="c1"&gt;# build images&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NODE_DIST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;centos7
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;USE_DELOREAN_TRUNK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DELOREAN_TRUNK_REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://trunk.rdoproject.org/centos7/current-tripleo/"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DELOREAN_REPO_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"delorean.repo"&lt;/span&gt;
&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;openstack&lt;span class="w"&gt; &lt;/span&gt;overcloud&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;--all&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;build_images.log

openstack&lt;span class="w"&gt; &lt;/span&gt;overcloud&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;upload

cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;instackenv.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;{&lt;/span&gt;
&lt;span class="s"&gt;  "nodes":[&lt;/span&gt;
&lt;span class="s"&gt;  {&lt;/span&gt;
&lt;span class="s"&gt;    "_comment":"nuc2",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_type":"pxe_amt",&lt;/span&gt;
&lt;span class="s"&gt;    "mac": [&lt;/span&gt;
&lt;span class="s"&gt;        "ec:a8:6b:fa:65:c7"&lt;/span&gt;
&lt;span class="s"&gt;    ],&lt;/span&gt;
&lt;span class="s"&gt;    "cpu": "4",&lt;/span&gt;
&lt;span class="s"&gt;    "memory": "7500",&lt;/span&gt;
&lt;span class="s"&gt;    "disk": "100",&lt;/span&gt;
&lt;span class="s"&gt;    "arch": "x86_64",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_user":"admin",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_password":"foobar",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_addr":"192.0.2.100"&lt;/span&gt;
&lt;span class="s"&gt;  },&lt;/span&gt;
&lt;span class="s"&gt;  {&lt;/span&gt;
&lt;span class="s"&gt;    "_comment":"nuc3",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_type":"pxe_amt",&lt;/span&gt;
&lt;span class="s"&gt;    "mac": [&lt;/span&gt;
&lt;span class="s"&gt;        "b8:ae:ed:71:3e:20"&lt;/span&gt;
&lt;span class="s"&gt;    ],&lt;/span&gt;
&lt;span class="s"&gt;    "cpu": "4",&lt;/span&gt;
&lt;span class="s"&gt;    "memory": "7500",&lt;/span&gt;
&lt;span class="s"&gt;    "disk": "100",&lt;/span&gt;
&lt;span class="s"&gt;    "arch": "x86_64",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_user":"admin",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_password":"foobar",&lt;/span&gt;
&lt;span class="s"&gt;    "pm_addr":"192.0.2.101"&lt;/span&gt;
&lt;span class="s"&gt;  }&lt;/span&gt;
&lt;span class="s"&gt;  ]&lt;/span&gt;
&lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
json_verify&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;instackenv.json

openstack&lt;span class="w"&gt; &lt;/span&gt;baremetal&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;--json&lt;span class="w"&gt; &lt;/span&gt;instackenv.json
openstack&lt;span class="w"&gt; &lt;/span&gt;baremetal&lt;span class="w"&gt; &lt;/span&gt;configure&lt;span class="w"&gt; &lt;/span&gt;boot

openstack&lt;span class="w"&gt; &lt;/span&gt;baremetal&lt;span class="w"&gt; &lt;/span&gt;introspection&lt;span class="w"&gt; &lt;/span&gt;bulk&lt;span class="w"&gt; &lt;/span&gt;start
openstack&lt;span class="w"&gt; &lt;/span&gt;overcloud&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;--templates
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Expected Outcome&lt;/h3&gt;
&lt;p&gt;If everything goes according to plan, we shall expect to see this message:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="mf"&gt;2016&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;03&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;03&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;34&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="n"&gt;overcloud&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;BlockStorageNodesPostDeployment&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zdtbamwswrr2&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CREATE_COMPLETE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;successfully&lt;/span&gt;
&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;overcloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CREATE_COMPLETE&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Caveats&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sleep modes. Because I turn off the NUCs via a power switch and because it puts the AMT processor in sleep mode and it needs an ICMP packet to wake up - which can take up to
  25 seconds - I just went ahead and disabled the AMT Power Saving Policy by choosing: "Mobile: ON in S0". If you do not do this you might have to tweak the &lt;em&gt;max_attempts&lt;/em&gt; and
  the &lt;em&gt;action_wait&lt;/em&gt; parameters under &lt;em&gt;amt&lt;/em&gt; in &lt;em&gt;/etc/ironic/ironic.conf&lt;/em&gt; on the undercloud.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If most ironic operations fail and you see the following error in the logs:&lt;/p&gt;
&lt;p&gt;2016-03-02 22:06:28.433 23958 WARNING ironic.conductor.manager [-] During sync_power_state, could not get power state for node 8afb31f9-6cef-4629-8a2a-5822a968b15d, attempt 1 of 3. Error: Wrong number or type of arguments for overloaded function #'new_Client'.
 Possible C/C++ prototypes are:
_WsManClient::_WsManClient(char const &lt;em&gt;)
_WsManClient::_WsManClient(char const &lt;/em&gt;,int const,char const &lt;em&gt;,char const &lt;/em&gt;,char const &lt;em&gt;,char const &lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;It is because the protocol string (in this case 'http') passed from ironic to the driver is actually &lt;em&gt;u"http"&lt;/em&gt; which confuses the openwsman SWIG bindings.
This is something I need to look at in more detail. For a quick fix I just hardcoded the proper string in &lt;em&gt;parse_driver_info&lt;/em&gt; in &lt;em&gt;ironic/drivers/modules/amt/common.py&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AMT seems to be flakey at times. While most of my deployments worked, a couple of times the AMT would just go on strike and some of the deployment steps would fail due to timeouts. I will also see if firmware updates will fix this. I haven't  hit this &lt;a href="http://acksyn.org/posts/2016/03/tripleo-on-nucs/bug"&gt;https://bugs.launchpad.net/ironic/+bug/1454492&lt;/a&gt; yet, but it seems that it can easily happen. Apparently a new python-only AMT driver is in the &lt;a href="https://github.com/sdague/amt"&gt;works&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Future&lt;/h3&gt;
&lt;p&gt;Over the next days, or better evenings, I will cleanup up the (trivial) patches so this all works out of the box. The changes are quite minimal but I need to kill the wsmancli dependency and test things a bit more (I also need to retest everything with openwsman 2.4 as shipped by CentOS, because I used a locally installed 2.6.2 version while chasing the unicode parameter bug mentioned above). I hope this saves some time to anyone trying the same ;)&lt;/p&gt;</description><category>en</category><category>openstack</category><category>tech</category><guid>http://acksyn.org/posts/2016/03/tripleo-on-nucs/</guid><pubDate>Thu, 03 Mar 2016 19:43:31 GMT</pubDate></item><item><title>Running Fedora MIPS</title><link>http://acksyn.org/posts/2015/06/running-fedora-mips/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;There is an ongoing effort to revive Fedora for &lt;a href="https://lists.fedoraproject.org/pipermail/mips/2015-June/000099.html"&gt;MIPS&lt;/a&gt;. In order to get a glimpse of this work in QEMU, do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the qcow mipsel64el image &lt;a href="http://mipsfedora.imgtec.com/development/22/mips64el/images/20150601/fedora-22-mips64el-20150601.qcow2"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download the kernel &lt;a href="http://mipsfedora.imgtec.com/development/22/mips64el/images/20150601/vmlinux-3.19.3.mtoman.20150408"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run your MIPS qemu instance as follows (note that I use a bridge called vnet0 on my host):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;qemu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mips64el&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;malta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;KEc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vmlinux&lt;/span&gt;&lt;span class="mf"&gt;-3.19.3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mtoman&lt;/span&gt;&lt;span class="mf"&gt;.20150408&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;drive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fedora&lt;/span&gt;&lt;span class="mi"&gt;-22&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mips64el&lt;/span&gt;&lt;span class="mf"&gt;-20150601.&lt;/span&gt;&lt;span class="n"&gt;qcow2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;netdev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bridge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hub0port0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vnet0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e1000&lt;/span&gt;&lt;span class="mi"&gt;-82545&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;netdev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hub0port0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"ro root=/dev/sda1 console=ttyS0 mem=256m@0x0 mem=1792m@0x90000000"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stdio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nographic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pty&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2015/06/running-fedora-mips/</guid><pubDate>Mon, 01 Jun 2015 12:17:00 GMT</pubDate></item><item><title>Performance Monitoring with PCP and Vector</title><link>http://acksyn.org/posts/2015/04/monitoring-with-pcp-and-vector/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;&lt;em&gt;Update: FchE notes that the &lt;code&gt;pcp-webapp-vector&lt;/code&gt; package is already part of Fedora, instructions amended&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://netflix.com"&gt;Netflix&lt;/a&gt; recently &lt;a href="http://techblog.netflix.com/2015/04/introducing-vector-netflixs-on-host.html"&gt;announced&lt;/a&gt; their new &lt;a href="https://github.com/Netflix/vector"&gt;Vector&lt;/a&gt; open-source monitoring tool.
Vector uses &lt;a href="http://pcp.io"&gt;Perfomance Co-Pilot&lt;/a&gt; as a framework to
fetch and manage metrics and provides a nice web GUI on top of it.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;The following steps are tested on Fedora 22 (or a pre-release of it in this case). First let's install the needed packages:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;dnf install -y pcp pcp-webapi pcp-webapp-vector
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let's get pcp and pcp-webapi configured and started first:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemctl enable pmcd pmwebd
systemctl start pmcd pmwebd
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At this point Vector is already installed correctly. If you installed vector on your machine
running a browser you simply need to point it to, otherwise replace &lt;code&gt;localhost&lt;/code&gt; with the machine
where pmwebd+vector are running:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;http://localhost:44323/vector/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note that Vector, which runs within the browser will connect to the remote
44323/tcp pmwebd port, so make sure it is accessible.&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;Once everything is installed correctly we simply need to open a browser on
and point it to the system where we installed Vector on port 8080.
Within the web UI we can then choose any server which has pmwebd running:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://acksyn.org/images/vector-2015-04-19.png"&gt;&lt;img alt="vector" src="http://acksyn.org/images/vector-2015-04-19.png"&gt;&lt;/a&gt;&lt;/p&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2015/04/monitoring-with-pcp-and-vector/</guid><pubDate>Mon, 20 Apr 2015 12:17:00 GMT</pubDate></item><item><title>Terminal Calendaring Application</title><link>http://acksyn.org/posts/2015/02/terminal-calendaring-application/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;As an avid &lt;a href="https://github.com/karelzak/mutt-kz"&gt;mutt-kz&lt;/a&gt; user, I always found it quite annoying
to have to use a web browser or my phone to check out my work calendar or upcoming birthdays.
I have slowly started to use &lt;a href="https://github.com/geier/khal"&gt;khal&lt;/a&gt; which is shaping up to be
a very nice calendaring application for use within terminals:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://acksyn.org/images/khal.png"&gt;&lt;img alt="khal" src="http://acksyn.org/images/khal.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For Fedora users I have created a &lt;a href="https://copr.fedoraproject.org/coprs/mbaldessari/khal/"&gt;COPR&lt;/a&gt; repo. As root, simply run:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;dnf copr enable mbaldessari/khal
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and then launch:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;dnf install khal
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will install the following packages: python-atomicwrites, vdirsyncer and khal
Once installed, we need to tell vdirsyncer where to fetch the caldav entries from.
My &lt;code&gt;~/.vdirsyncer/config&lt;/code&gt; is as follows and contains my birthday list from Facebook and my work calendar:&lt;/p&gt;
&lt;p&gt;At this point you can run &lt;code&gt;vdirsyncer sync&lt;/code&gt; and the entries will be fetched
and stored locally. Note that if you get SSL validation errors you most likely
need to import your company Root CA:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;# cp MY-CA-root-cert.pem /etc/pki/ca-trust/source/anchors/
# update-ca-trust extract
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once vdirsyncer has completed fetching all the entries, it is time to display them
in &lt;code&gt;khal&lt;/code&gt; or in its interactive cousin &lt;code&gt;ikhal&lt;/code&gt;. Here is my &lt;code&gt;~/.config/khal/khal.conf&lt;/code&gt; file:&lt;/p&gt;
&lt;p&gt;That's it. There is still some work todo before I can ditch other
calendaring applications completely. Namely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/geier/khal/issues/148"&gt;VAlarm Notification support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Integration with mutt (both for carddav and caldav/.ics attachments)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know if you have any issues with the copr repo.&lt;/p&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2015/02/terminal-calendaring-application/</guid><pubDate>Mon, 23 Feb 2015 20:50:00 GMT</pubDate></item><item><title>Performance Analysis with Performance Co-Pilot, iPython and pandas</title><link>http://acksyn.org/posts/2014/12/performance-analysis-with-performance-co-pilot/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;One of many reasons to love &lt;a href="http://www.pcp.io"&gt;Performance Co-Pilot&lt;/a&gt;, is the fact that it is a
fully fledged framework to do performance analysis. It makes it extremely simple to extend
and to build anything on top of it. In this post we shall explore how simple it is to analyze your
performance data using &lt;a href="http://ipython.org"&gt;iPython&lt;/a&gt; and &lt;a href="http://pandas.sourceforge.net"&gt;pandas&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://acksyn.org/images/panda.jpg"&gt;&lt;img alt="panda" src="http://acksyn.org/images/panda.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Setup&lt;/h3&gt;
&lt;p&gt;To start we will need some PCP archives which contain some collected metrics from a system. In
this post I will use the data I collect on my home firewall and will try to analyze some of
the data there in. To learn how to store performance metrics in an archive, take a look at
&lt;a href="http://pcp.io/man/man1/pmlogger.1.html"&gt;pmlogger&lt;/a&gt; and the &lt;a href="http://pcp.io/docs/guide.html"&gt;Quickstart guide&lt;/a&gt;.
For this example I collected data over the course of a day with a 1 minute interval.&lt;/p&gt;
&lt;h3&gt;iPython and PCP&lt;/h3&gt;
&lt;p&gt;First of all you need to import a small python module that bridges PCP and pandas/numpy:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;git clone https://github.com/mbaldessari/pcpinteractive.git
cd pcpinteractive
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now let us start our iPython console, import our python module and load our archive:&lt;/p&gt;
&lt;p&gt;At this point the data is fully parsed in memory and we can start analyzing it, using
all the standard tools like pandas and matplotlib.
Let's start by looking at how many metrics are present in the archive:&lt;/p&gt;
&lt;h3&gt;Pandas and PCP&lt;/h3&gt;
&lt;p&gt;Now we can get a pandas object out of a metric. Let's take incoming and outgoing network traffic
expressed in bytes over time.&lt;/p&gt;
&lt;p&gt;We can now graph the data obtained with a simple:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://acksyn.org/images/netpcpmatplot.png"&gt;&lt;img alt="netpcpmatplot" src="http://acksyn.org/images/netpcpmatplot.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And we can also explore the data with the use of the &lt;code&gt;describe()&lt;/code&gt; method, but first 
let's force the output to be in non-scientific notation as it is more readable for
network data:&lt;/p&gt;
&lt;h3&gt;Manipulate the data&lt;/h3&gt;
&lt;p&gt;Now let's see what is possible to do in terms of data manipulation:
* Drop columns we do not care about:&lt;/p&gt;
&lt;p&gt;Or, alternatively:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Resample data at lower intervals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filter out all the zero columns&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show last element:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select a smaller timeframe:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get one column with:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply a function on the whole dataframe:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sum all values for each column:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Calculate the mean for each column:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find the time of day when the max values are reached&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select only the tun0 and eth0 devices:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Merge and group dataframes&lt;/h3&gt;
&lt;p&gt;Now let's merge the &lt;code&gt;net_in&lt;/code&gt; and the &lt;code&gt;net_out&lt;/code&gt; dataframes into a single one, in order
to try and do some analysis on both traffic directions at the same time.&lt;/p&gt;
&lt;p&gt;Another very interesting aspect is the plethora of statistical functions that come for free through
the use of pandas. For example, to find covariance() and correlation() we can use the following methods:&lt;/p&gt;
&lt;p&gt;We can also group columns like the following:&lt;/p&gt;
&lt;p&gt;Calculate the rolling mean of an interface and plot it:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://acksyn.org/images/rollingmeanpcp.png"&gt;&lt;img alt="rollingmean" src="http://acksyn.org/images/rollingmeanpcp.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Export data&lt;/h3&gt;
&lt;p&gt;Save the data in csv file or in excel format:&lt;/p&gt;
&lt;p&gt;Other outputs like latex, sql, clipboard, hd5f and more are supported.&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;The versatility of PCP allows anyone to use many currently available frameworks (numpy, pandas, R, scipy) to analyze
and display the collected performance data. There is some work to be done to make this process a bit simpler with an
out of the box PCP installation.&lt;/p&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2014/12/performance-analysis-with-performance-co-pilot/</guid><pubDate>Tue, 30 Dec 2014 17:41:00 GMT</pubDate></item><item><title>Observing X11 protocol differences</title><link>http://acksyn.org/posts/2014/10/observing-x11-protocol-differences/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;I was trying to understand some oddities going with an X11 legacy application showing bad artifacts in one environment and working flawlessly in another environment. Since wireshark does not have any support for diffing two pcaps, I came up with the following steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dump both &lt;code&gt;working.pcap&lt;/code&gt; and &lt;code&gt;nonworking.pcap&lt;/code&gt; into text files with full headers:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Devel&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wireshark&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tshark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pcap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"x11"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Devel&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wireshark&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tshark&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notworking&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pcap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"x11"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;notworking&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Prune the two text files with a script like the following:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"r"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;x11_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x11_state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;x11_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'X11'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; \
                    &lt;span class="s2"&gt;"Property"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;x11_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"w"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'__main__'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"working.txt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"working-trimmed.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"notworking.txt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"notworking-trimmed.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;At this point we can easily &lt;code&gt;vimdiff&lt;/code&gt; the outputs obtained from above via &lt;code&gt;vimdiff working-trimmed.txt notworking-trimmed.txt&lt;/code&gt;:
&lt;a href="http://acksyn.org/images/vimdiff.png"&gt;&lt;img alt="vimdiff" src="http://acksyn.org/images/vimdiff.png"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2014/10/observing-x11-protocol-differences/</guid><pubDate>Thu, 16 Oct 2014 09:51:00 GMT</pubDate></item><item><title>Performance Co-Pilot and Arduino (part 2)</title><link>http://acksyn.org/posts/2014/10/performance-co-pilot-and-arduino-part-2/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;After initially setting up &lt;a href="http://acksyn.org/blog/2014/10/09/performance-co-pilot-and-arduino/"&gt;Performance Co-Pilot and Arduino&lt;/a&gt;, I wanted to improve the data being displayed. As latency is quite important to me, I wanted to display that as well. I did not have too much time on my hands to code a new PMDA that collects that information, so I abused the &lt;strong&gt;pmdashping(1)&lt;/strong&gt; for this purpose. The steps are simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;/var/lib/pcp/pmdas/shping&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;sample.conf&lt;/code&gt; with the following line:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pcp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pmdas&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shping&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;/var/lib/pcp/pmdas/shping/ping.sh&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# This hack will break if latency &amp;gt; 254 ;)&lt;/span&gt;
&lt;span class="nv"&gt;ret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;ping&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;acksyn.org&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;^rtt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-f5&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-f1&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ret&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Launch &lt;code&gt;./Install&lt;/code&gt; and choose &lt;code&gt;[2] ./sample.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Now it is possible to abuse the &lt;code&gt;shping.error&lt;/code&gt; metric to fetch that value:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;    $ pminfo -f shping.error
    shping.error
       inst [0 or "8.8.8.8"] value 52
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The last step was to fetch this via &lt;strong&gt;PMWEBAPI(3)&lt;/strong&gt;. This did not work until I realized, thanks to &lt;a href="https://web.elastic.org/~fche/blog3/weblog/fcheblog"&gt;Fche's&lt;/a&gt; suggestion that the issue was related to my inital context initialization. As a matter of fact there is a big difference between the following two:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/pmapi/context?local=ANYTHING&lt;/code&gt; - Creates a PM_CONTEXT_LOCAL PMAPI context.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/pmapi/context?hostname=STRING&lt;/code&gt; - Creates a PM_CONTEXT_HOST PMAPI context with the given host name and/or extended specification.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The man page of &lt;strong&gt;pmNewContext(3)&lt;/strong&gt; explains this in more detail. Frank has added some more info to the &lt;code&gt;PMWEBAPI(3)&lt;/code&gt; man page via the &lt;a href="https://www.sourceware.org/git/gitweb.cgi?p=pcpfans.git;a=blobdiff;f=man/man3/pmwebapi.3;h=20fd4355b40859a1d65cd914cbfb3546b7d1369e;hp=b0a1664b3ebf956db360b08f140aa15e17767562;hb=63b827cc0f2b5fce23e4db47b619ebf309bea1f1;hpb=7fa8d8a1bffd83b3c0346e2777e8162784a452be"&gt;following&lt;/a&gt; commit, to make it a little bit more obvious. It's still a pretty gross hack, but for the time being it's enough for my needs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://acksyn.org/images/arduino-pcp2.png"&gt;&lt;img alt="arduino-pcp" src="http://acksyn.org/images/arduino-pcp2.png"&gt;&lt;/a&gt;&lt;/p&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2014/10/performance-co-pilot-and-arduino-part-2/</guid><pubDate>Tue, 14 Oct 2014 13:59:00 GMT</pubDate></item><item><title>Performance Co-Pilot and Arduino</title><link>http://acksyn.org/posts/2014/10/performance-co-pilot-and-arduino/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;Besides being an incredible nice toolkit to work with, &lt;a href="http://pcp.io/"&gt;Performance Co-Pilot&lt;/a&gt; is extremely simple to integrate with any application. Amongst an extensive API it allows to export any metric via JSON using the &lt;strong&gt;PMWEBAPI(3)&lt;/strong&gt;. I actived this feature on my &lt;a href="http://soekris.eu/shop/net5501/net5501_60_board_only_en.html"&gt;Soekris&lt;/a&gt; firewall by installing PCP and running both the &lt;strong&gt;pmcd&lt;/strong&gt; and the &lt;strong&gt;pmwebd&lt;/strong&gt; services. Once &lt;strong&gt;pmwebd&lt;/strong&gt; is active, querying any metric is quite simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In python the first step is to get a context:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'pmapi/context?local=foo'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ctx_local&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'context'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;With this context we can get info about a specific metric:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;    &lt;span class="n"&gt;ctxurl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'pmapi/'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx_local&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ctxurl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'_fetch?names=network.interface.out.bytes'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The returned JSON is something along the following lines:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;{u'timestamp': {u's': 1412888245, u'us': 443665}, u'values': [{u'instances': 
   [{u'instance': 0, u'value': 503730734}, {u'instance': 1, u'value': 17610637798}, ...
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Armed with an Arduino with a 328 Atmel onboard, an Ethernet shield and a 2x16 LCD I wanted to display my ADSL bandwith use. Instead of having to write a network parser for the PCP protocol (or worse SNMP), it's simple to use the exported JSON data for this. Here are the results:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://acksyn.org/images/arduino-pcp.jpg"&gt;&lt;img alt="arduino-pcp" src="http://acksyn.org/images/arduino-pcp.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'll eventually clean up the C code I used for this and publish it somewhere.&lt;/p&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2014/10/performance-co-pilot-and-arduino/</guid><pubDate>Thu, 09 Oct 2014 20:33:00 GMT</pubDate></item><item><title>Direction of Captured Packets</title><link>http://acksyn.org/posts/2014/05/direction-of-captured-packets/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;When capturing network traffic on an interface, it is usually pretty obvious which direction the packets are going. Let's take a typical Linux machine that hosts some VMs over a linux bridge. The interfaces will look like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c"&gt;Physical   Linux     Linux      VM&lt;/span&gt;
&lt;span class="c"&gt;  Nic      Bridge     Tap     Interface&lt;/span&gt;
&lt;span class="nb"&gt;--------&lt;/span&gt;&lt;span class="c"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;-------&lt;/span&gt;&lt;span class="c"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;---------&lt;/span&gt;&lt;span class="c"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;--------&lt;/span&gt;
&lt;span class="c"&gt;| eth0 |&lt;/span&gt;&lt;span class="nb"&gt;--&lt;/span&gt;&lt;span class="c"&gt;| br0 |&lt;/span&gt;&lt;span class="nb"&gt;--&lt;/span&gt;&lt;span class="c"&gt;| vnet0 |&lt;/span&gt;&lt;span class="nb"&gt;--&lt;/span&gt;&lt;span class="c"&gt;| eth0 |&lt;/span&gt;
&lt;span class="nb"&gt;--------&lt;/span&gt;&lt;span class="c"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;-------&lt;/span&gt;&lt;span class="c"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;---------&lt;/span&gt;&lt;span class="c"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;--------&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When the VM does an &lt;a href="http://en.wikipedia.org/wiki/Address_Resolution_Protocol"&gt;ARP resolution&lt;/a&gt; we will see the following on the host's &lt;code&gt;eth0&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="mf"&gt;52&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mf"&gt;33.575036&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;Who&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.0.254&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Tell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.1.70&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="mf"&gt;53&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mf"&gt;33.577890&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;33&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;60&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mf"&gt;192.168.0.254&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;30&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this case it is clear that, from &lt;code&gt;eth0&lt;/code&gt;'s point of view, packet 52 is outgoing and 53 is the incoming reply. There are some situations though, where this is not &lt;strong&gt;completely&lt;/strong&gt; obvious:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="mf"&gt;58&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mf"&gt;22.252109&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;Who&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.0.254&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Tell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.1.70&lt;/span&gt;
&lt;span class="mf"&gt;59&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mf"&gt;22.252202&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;Who&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.0.254&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Tell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;192.168.1.70&lt;/span&gt;
&lt;span class="mf"&gt;60&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mf"&gt;22.254918&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;33&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;60&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mf"&gt;192.168.0.254&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;30&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the above example, we could assume that both 58 and 59 were outgoing packets, but we'd be wrong. Although size 42 suggests that it has not been padded to ethernet's minimal frame size, frame number 59 is not really coming from the "external network". One hint is that arp requests are sent with a second interval between each request, so it'd be unlikely that the VM is the creator of the second packet too.
So where is 59 coming from? It turns out that with SR-IOV enabled, some cards' onboard switch &lt;a href="http://www-dl.emulex.com/support/elx/rt960/b12/docs/linux/linux_relnotes_elx.pdf"&gt;loops&lt;/a&gt; packets back.
Why is that a problem? Glad you asked.&lt;/p&gt;
&lt;p&gt;When the Linux bridge sees packet 59, it records the mac-address &lt;code&gt;52:54:00:11:22:33&lt;/code&gt; as coming from &lt;code&gt;eth0&lt;/code&gt;, and not from the locally connected &lt;code&gt;vnet0&lt;/code&gt; tunnel. When packet 60 arrives, the bridge will drop it because it believes the destination MAC address is on &lt;code&gt;eth0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Long story short, in order to troubleshoot these kinds of issues, I know of three ways to be able to see the direction of packets:&lt;/p&gt;
&lt;h3&gt;tcpdump&lt;/h3&gt;
&lt;p&gt;With a fairly recent tcpdump/libpcap you can specify the &lt;code&gt;-P in|out|inout&lt;/code&gt; option and capture traffic in a specific direction. In a situation like the one described here, it will be a bit cumbersome as you will need two separate tcpdump instances, but it works.&lt;/p&gt;
&lt;h3&gt;netsniff-ng&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://netsniff-ng.org/"&gt;netsniff-ng&lt;/a&gt; can do an incredible number of cool things. Amongst others, it shows the direction of packets by default:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;em1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1400412101&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;.&lt;span class="mi"&gt;907918291&lt;/span&gt;&lt;span class="nv"&gt;ns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Eth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;MAC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;:&lt;span class="mi"&gt;00&lt;/span&gt;:&lt;span class="mi"&gt;24&lt;/span&gt;:&lt;span class="nv"&gt;cc&lt;/span&gt;:&lt;span class="mi"&gt;27&lt;/span&gt;:&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;:&lt;span class="mi"&gt;41&lt;/span&gt;:&lt;span class="mi"&gt;38&lt;/span&gt;:&lt;span class="nv"&gt;ab&lt;/span&gt;:&lt;span class="mi"&gt;99&lt;/span&gt;:&lt;span class="nv"&gt;e2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x0806&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARP&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Vendor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CONNECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Hewlett&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;Packard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Company&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Ethernet&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x0800&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;IPv4&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opcode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Chr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;..................&lt;span class="w"&gt; &lt;/span&gt;]
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Hex&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;em1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1400412101&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;.&lt;span class="mi"&gt;907936759&lt;/span&gt;&lt;span class="nv"&gt;ns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Eth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;MAC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;:&lt;span class="mi"&gt;41&lt;/span&gt;:&lt;span class="mi"&gt;38&lt;/span&gt;:&lt;span class="nv"&gt;ab&lt;/span&gt;:&lt;span class="mi"&gt;99&lt;/span&gt;:&lt;span class="nv"&gt;e2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;:&lt;span class="mi"&gt;00&lt;/span&gt;:&lt;span class="mi"&gt;24&lt;/span&gt;:&lt;span class="nv"&gt;cc&lt;/span&gt;:&lt;span class="mi"&gt;27&lt;/span&gt;:&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x0806&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARP&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Vendor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Hewlett&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;Packard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Company&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;CONNECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AS&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]
&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Ethernet&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;x0800&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;IPv4&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Len&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opcode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;reply&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;pktdump&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://launchpad.net/pktdump"&gt;pktdump&lt;/a&gt; is the most user-friendly of the three. It is not in Fedora, but I've build a COPR repo &lt;a href="http://copr.fedoraproject.org/coprs/mbaldessari/pktdump/repo/fedora-20-x86_64/mbaldessari-pktdump-fedora-20-x86_64.repo"&gt;here&lt;/a&gt;. Here's an example output:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;# pktdump -i em1 -f 'arp'
Capturing packets on the 'em1' interface
[12:24:07] RX(em1) : ARP| REQUEST 00:00:24:CC:27:40 192.168.0.254 00:00:00:00:00:00 foo.int.
[12:24:07] TX(em1) : ARP| REPLY 2C:41:38:AB:99:E2 foo.int 00:00:24:CC:27:40 192.168.0.254
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It's especially useful when trying to follow the route packets are taking in a complex multi-interface setup.&lt;/p&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2014/05/direction-of-captured-packets/</guid><pubDate>Sun, 18 May 2014 09:49:00 GMT</pubDate></item><item><title>Just a test</title><link>http://acksyn.org/posts/2014/05/test/</link><dc:creator>Michele Baldessari</dc:creator><description>&lt;p&gt;Just moved the blog to &lt;a href="http://octopress.org/"&gt;Octopress&lt;/a&gt;&lt;/p&gt;</description><category>en</category><category>fedora</category><category>tech</category><guid>http://acksyn.org/posts/2014/05/test/</guid><pubDate>Sat, 10 May 2014 21:37:00 GMT</pubDate></item></channel></rss>