<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2021-04-22T16:23:49+00:00</updated><id>/feed.xml</id><title type="html">Pluginized Protocols</title><subtitle>Pluginized Protocols : a new approach to design, specify and implement Internet protocols so that they can naturally evolve. Already applied to QUIC, BGP, TCPLS or TCP</subtitle><entry><title type="html">TCPLS featured on the APNIC blog</title><link href="/tcpls/2021/04/15/apnic-blog.html" rel="alternate" type="text/html" title="TCPLS featured on the APNIC blog" /><published>2021-04-15T00:00:00+00:00</published><updated>2021-04-15T00:00:00+00:00</updated><id>/tcpls/2021/04/15/apnic-blog</id><content type="html" xml:base="/tcpls/2021/04/15/apnic-blog.html">&lt;p&gt;The &lt;a href=&quot;https://blog.apnic.net&quot;&gt;APNIC blog&lt;/a&gt; regularly publishes posts on recent scientific articles that could be of interest for the networking community. In a blog post entitled &lt;a href=&quot;https://blog.apnic.net/2021/04/15/introducing-tcpls-a-game-of-transport-protocols/&quot;&gt;Introducing TCPLS: A game of transport protocols&lt;/a&gt;, &lt;a href=&quot;https://frochet.github.io&quot;&gt;Florentin Rochet&lt;/a&gt; describes some of key features of &lt;a href=&quot;https://pluginized-protocols.org/tcpls/&quot;&gt;TCPLS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blog.apnic.net/wp-content/uploads/2021/04/TCPLS-header-modified.png&quot; alt=&quot;tcpls blog&quot; /&gt;&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="tcpls" /><summary type="html">The APNIC blog regularly publishes posts on recent scientific articles that could be of interest for the networking community. In a blog post entitled Introducing TCPLS: A game of transport protocols, Florentin Rochet describes some of key features of TCPLS.</summary></entry><entry><title type="html">2021 ANRP award for xBGP</title><link href="/xbgp/2021/01/05/anrp.html" rel="alternate" type="text/html" title="2021 ANRP award for xBGP" /><published>2021-01-05T00:00:00+00:00</published><updated>2021-01-05T00:00:00+00:00</updated><id>/xbgp/2021/01/05/anrp</id><content type="html" xml:base="/xbgp/2021/01/05/anrp.html">&lt;p&gt;Every year, the &lt;a href=&quot;https://irtf.org&quot;&gt;Internet Research Task Force&lt;/a&gt; awards the &lt;a href=&quot;https://irtf.org/anrp/&quot;&gt;Applied Networking Research Prize (ANRP)&lt;/a&gt; to recognise the best recent results in applied networking, interesting new research ideas of potential relevance to the Internet standards community. In late 2020, 78 papers published in networking conferences and journals were nominated. The xBGP paper, &lt;a href=&quot;https://dl.acm.org/doi/10.1145/3422604.3425952&quot;&gt;xBGP: When You Can’t Wait for the IETF and Vendors&lt;/a&gt;
 written by Thomas Wirtgen (UCLouvain), Quentin De Coninck (UCLouvain), Randy Bush (Internet Initiative Japan &amp;amp; Arrcus, Inc), Laurent Vanbever (ETH Zürich) and Olivier Bonaventure (UCLouvain) was selected with five other articles. It will be presented by Thomas Wirtgen at a forthcoming IETF meeting.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/xbgp-paper.png&quot; alt=&quot;xbgp paper&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This award shows the interest from the community on the xBGP effort.&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="xbgp" /><summary type="html">Every year, the Internet Research Task Force awards the Applied Networking Research Prize (ANRP) to recognise the best recent results in applied networking, interesting new research ideas of potential relevance to the Internet standards community. In late 2020, 78 papers published in networking conferences and journals were nominated. The xBGP paper, xBGP: When You Can’t Wait for the IETF and Vendors written by Thomas Wirtgen (UCLouvain), Quentin De Coninck (UCLouvain), Randy Bush (Internet Initiative Japan &amp;amp; Arrcus, Inc), Laurent Vanbever (ETH Zürich) and Olivier Bonaventure (UCLouvain) was selected with five other articles. It will be presented by Thomas Wirtgen at a forthcoming IETF meeting.</summary></entry><entry><title type="html">A first xBGP plugin</title><link href="/xbgp/2020/11/29/xbgp-hello.html" rel="alternate" type="text/html" title="A first xBGP plugin" /><published>2020-11-29T00:00:00+00:00</published><updated>2020-11-29T00:00:00+00:00</updated><id>/xbgp/2020/11/29/xbgp-hello</id><content type="html" xml:base="/xbgp/2020/11/29/xbgp-hello.html">&lt;p&gt;An xBGP compliant implementation such as our forks of &lt;a href=&quot;https://github.com/pluginized-protocols/xbgp_bird&quot;&gt;BIRD&lt;/a&gt; and &lt;a href=&quot;https://github.com/pluginized-protocols/xbgp_frr&quot;&gt;FRRouting&lt;/a&gt; supports a simple API that enables network operators and researchers to extend it. The xBGP API is defined and briefly documented in &lt;a href=&quot;https://github.com/pluginized-protocols/xbgp_plugins/blob/master/xbgp_compliant_api/xbgp_plugin_api.h&quot;&gt;xbgp_plugin_api.h&lt;/a&gt;. In this post, we start with a very simple xBGP extension that we implement using a plugin.&lt;/p&gt;

&lt;p&gt;The BGP specifications define the format of the BGP messages. The UPDATE message is the most complex BGP message since it contains the information about the new routes. BGP supports different BGP Path Attributes that are defined in various RFCs. Each of these path attributes is identified using a one byte integer. IANA maintains a &lt;a href=&quot;https://www.iana.org/assignments/bgp-parameters/bgp-parameters.xhtml#bgp-parameters-2&quot;&gt;list with all the known path attributes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For our first example, we simply assume that a network operator would like to ignore the BGP UPDATE messages that contain an unknown attribute. A practical example of this usage is when problems with the processing of &lt;a href=&quot;https://kb.juniper.net/InfoCenter/index?page=content&amp;amp;id=JSA10491&quot;&gt;BGP Path attribute 128&lt;/a&gt; caused the failure of BGP sessions. To support this feature, we retrieve the list of allocated BGP path attribute identifiers from IANA. We use it to create the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_known_attr&lt;/code&gt; macro that checks this validity.&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include &quot;ubpf_api.h&quot;
#include &quot;bytecode_public.h&quot;
&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#define is_known_attr(code) ( \
    ((code) == RESERVED_ATTR_ID) || \
    ((code) == ORIGIN_ATTR_ID) || \
    ((code) == AS_PATH_ATTR_ID) || \
    ...
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This filter needs to be attached to the xBGP implementation at the code point where it parses an incoming BGP message, i.e., at location &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; in the figure below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bgp-points.png&quot; alt=&quot;BGP insertion points&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The next step is to write a small C function that parses the received message and checks the attributes that it contains.&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;uint64_t&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;parse_attribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args_t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UNUSED&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;uint8_t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;code&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_arg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// argument 0 is the code attribute received from the neighbor.&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// unable to retrieve the argument (internal failure)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EXIT_FAILURE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;is_known_attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EXIT_FAILURE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can experiment with this simple plugin as follows. Save your plugin as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;valid_attr.c&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First, the C program must be compiled to an eBPF bytecode. This can be done with the clang compiler.
However for the sake of simplicity, we provide a Makefile that contains the prebuilt commands to
successfully compile your plugins.&lt;/p&gt;

&lt;p&gt;Clone our GitHub repository:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone https://github.com/pluginized-protocols/xbgp_plugins.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The libxbgp folder must also be cloned. It contains headers that are required to interact with the eBPF userspace virtual
machine. For example, they contain functions to allocate memory, retrieve arguments (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_arg&lt;/code&gt;) from the host implementation and using
base functions such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;htonl&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ntohl&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;All your plugins must be located in the cloned folder because it contains the required headers that define the xBGP API used by the plugins.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xbgp_plugins&lt;/code&gt; folder, execute the following command:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;make &lt;span class=&quot;nv&quot;&gt;LIBXBGP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&amp;lt;path/to/the/libxbgp cloned repository&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This command will browse the entire folder and its subfolders recursively to find any &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.c&lt;/code&gt; files. For each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.c&lt;/code&gt; file, the clang compiler will produce the associated object (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.o&lt;/code&gt;) file. This will be the eBPF bytecode of your plugin.&lt;/p&gt;

&lt;p&gt;Take the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;valid_attr.o&lt;/code&gt; associated with the function written previously. You are now ready to inject it inside one xBGP compliant
BGP implementation. In this tutorial, we provide the steps to successfully update the FRRouting BGPD daemon. The steps are similar for BIRD routing.&lt;/p&gt;

&lt;p&gt;Our modified version of FRR BGPD requires that each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.o&lt;/code&gt; must be located in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;config_frr_dir&amp;gt;/frr/plugins&lt;/code&gt;. By default, and
depending on the compilation of FRRouting, the default configuration folder is  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/frr/plugins&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The next step is to update the manifest. This manifest is a json formatted file that is read by the daemon
at startup to include all the plugins that it contains. It is located at
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;config_frr_dir&amp;gt;/frr/plugins/manifest.json&lt;/code&gt;. Modify it as follows:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;jit_all&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;plugins&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;filter_invalid_attr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;extra_mem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;shared_mem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;obj_code_list&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;invalid_attr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;obj&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;invalid_attr.o&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;jit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;insertion_points&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;bgp_decode_attr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;replace&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;invalid_attr&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This manifest contains several required fields :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugins&lt;/code&gt;: contains the definition of all that plugins that must be loaded at startup time.
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;plugin_name&amp;gt;&lt;/code&gt;: the identifier of the plugin. In this example, we use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filter_invalid_attr&lt;/code&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extra_mem&lt;/code&gt;: how many &lt;em&gt;*bytes*&lt;/em&gt; to allocate for the API function. Some functions need extra memory to allocate
             data retrieved from the host implementation. Other functions such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctx_malloc&lt;/code&gt; rely on this
             memory space.&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shared_mem&lt;/code&gt;: how many &lt;em&gt;*bytes*&lt;/em&gt; to allocate for the memory space shared among the pluglets of the same plugin.
              This memory space is used by functions of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shared_memory&lt;/code&gt;.&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;obj_code_list&lt;/code&gt;: contains the list of the pluglets that belong to the same plugin. Each pluglet must have a unique
                 identifier. In the example, we use the identifier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;invalid_attr&lt;/code&gt;.
            &lt;ul&gt;
              &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;pluglet_identifier&amp;gt;&lt;/code&gt;: the identifier associated with the actual eBPF bytecode object.
                &lt;ul&gt;
                  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;obj&lt;/code&gt;: the real name of the file containing the eBPF bytecode.&lt;/li&gt;
                  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jit&lt;/code&gt;: whether or not the pluglet must be converted to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x86_64&lt;/code&gt; machine code (can be omitted. Default: false).&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;insertion_points&lt;/code&gt;: this object field defines the location of each pluglet of a given plugin inside the host BGP
                    implementation. This field takes a list of insertion point identifiers. We want that our
                    plugin composed of one pluglet is executed at  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bgp_decode_attr&lt;/code&gt;.
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;insertion_point_id&amp;gt;&lt;/code&gt;: defines the list of pluglets that must be executed at this insertion_point
        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;replace|pre|post&amp;gt;&lt;/code&gt;: contains all the pluglets that will be executed in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;replace&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pre&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;post&lt;/code&gt;
                      part of the insertion_point.
            &lt;ul&gt;
              &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;execution order (int)&amp;gt;&lt;/code&gt;: the value associated to the int is the pluglet identifier defined in the
                           plugin part of the manifest. In our example we want to execute the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;invalid_attr.o&lt;/code&gt;
                           bytecode as the first pluglet of this insertion point. In the
                           case of multiple insertion point the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;execution order&lt;/code&gt; field determines the order
                           of execution. Pluglet &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; is executed first, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;, …&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the manifest has been saved and the pluglets saved in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;config_frr_dir&amp;gt;/etc/plugins&lt;/code&gt; file, you are now ready to start
the BGP daemon.&lt;/p&gt;

&lt;p&gt;To observe the filter behavior, we recommend that you use &lt;a href=&quot;https://github.com/Exa-Networks/exabgp&quot; title=&quot;ExaBGP GitHub&quot;&gt;ExaBGP&lt;/a&gt; to generate custom attributes.&lt;/p&gt;

&lt;p&gt;Finally, we provide a &lt;a href=&quot;https://github.com/pluginized-protocols/libxbgp/blob/master/misc/Dockerfile_xbgp&quot; title=&quot;xBGP Dockerfile&quot;&gt;Dockerfile&lt;/a&gt; that includes our modified version of both BIRD and FRRouting, as well as a compiler (clang) to generate eBPF
bytecodes. Currently, you need to manually to start the BGP from inside the docker. We will continue to maintain the docker to
improve its configuration.&lt;/p&gt;</content><author><name>Thomas Wirtgen</name></author><category term="xbgp" /><summary type="html">An xBGP compliant implementation such as our forks of BIRD and FRRouting supports a simple API that enables network operators and researchers to extend it. The xBGP API is defined and briefly documented in xbgp_plugin_api.h. In this post, we start with a very simple xBGP extension that we implement using a plugin.</summary></entry><entry><title type="html">xBGP presented at IETF109</title><link href="/xbgp/2020/11/19/rtgwg-ietf109.html" rel="alternate" type="text/html" title="xBGP presented at IETF109" /><published>2020-11-19T00:00:00+00:00</published><updated>2020-11-19T00:00:00+00:00</updated><id>/xbgp/2020/11/19/rtgwg-ietf109</id><content type="html" xml:base="/xbgp/2020/11/19/rtgwg-ietf109.html">&lt;p&gt;Olivier Bonaventure presented xBGP on November 19th, 2020 to the TCPM working group at &lt;a href=&quot;https://ietf.org/how/meetings/109/&quot;&gt;IETF109&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/xbgp-ietf109.png&quot; alt=&quot;xbgp slides&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can download the &lt;a href=&quot;https://datatracker.ietf.org/meeting/109/materials/slides-109-rtgwg-sessb-23-xbgp-00&quot;&gt;pdf version of his slides&lt;/a&gt; or &lt;a href=&quot;https://youtu.be/aVc5u0_5NYQ?t=2183&quot;&gt;listen to his presentation on youtube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can find additional information in the Hotnets’20 paper &lt;a href=&quot;https://dl.acm.org/doi/10.1145/3422604.3425952&quot;&gt;xBGP: When You Can’t Wait for the IETF and Vendors&lt;/a&gt; written by  Thomas Wirtgen and Quentin De Coninck (UCLouvain); Randy Bush (Internet Initiative Japan &amp;amp; Arrcus, Inc); Laurent Vanbever (ETH Zürich) and Olivier Bonaventure (UCLouvain)&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="xbgp" /><summary type="html">Olivier Bonaventure presented xBGP on November 19th, 2020 to the TCPM working group at IETF109</summary></entry><entry><title type="html">TCPLS presented at IETF109</title><link href="/tcpls/2020/11/18/tcpls-ietf109.html" rel="alternate" type="text/html" title="TCPLS presented at IETF109" /><published>2020-11-18T00:00:00+00:00</published><updated>2020-11-18T00:00:00+00:00</updated><id>/tcpls/2020/11/18/tcpls-ietf109</id><content type="html" xml:base="/tcpls/2020/11/18/tcpls-ietf109.html">&lt;p&gt;Olivier Bonaventure presented TCPLS on November 18th, 2020 to the TCPM working group at &lt;a href=&quot;https://ietf.org/how/meetings/109/&quot;&gt;IETF109&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tcpls-ietf109.png&quot; alt=&quot;tcpls paper&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can download the &lt;a href=&quot;https://datatracker.ietf.org/meeting/109/materials/slides-109-tcpm-tcpls-00&quot;&gt;pdf version of his slides&lt;/a&gt; or &lt;a href=&quot;https://youtu.be/8WZdXe1pajU?t=6778&quot;&gt;listen to his presentation on youtube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More details are provided in the &lt;a href=&quot;https://dl.acm.org/doi/10.1145/3422604.3425947&quot;&gt;TCPLS: Closely Integrating TCP and TLS&lt;/a&gt; paper written by Florentin Rochet (UCL Crypto Group); Emery Assogba and Olivier Bonaventure (UCLouvain) and presented at Hotnets’20.&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="tcpls" /><summary type="html">Olivier Bonaventure presented TCPLS on November 18th, 2020 to the TCPM working group at IETF109</summary></entry><entry><title type="html">TCPLS presented at Hotnets’20</title><link href="/tcpls/2020/11/05/tcpls-paper.html" rel="alternate" type="text/html" title="TCPLS presented at Hotnets’20" /><published>2020-11-05T00:00:00+00:00</published><updated>2020-11-05T00:00:00+00:00</updated><id>/tcpls/2020/11/05/tcpls-paper</id><content type="html" xml:base="/tcpls/2020/11/05/tcpls-paper.html">&lt;p&gt;Florentin Rochet presented TCPLS on November 4th, 2020 at &lt;a href=&quot;https://conferences.sigcomm.org/hotnets/2020/program.html&quot;&gt;HotNets 2020: Nineteenth ACM Workshop on Hot Topics in Networks&lt;/a&gt;. The full paper is available from the ACM DL :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dl.acm.org/doi/10.1145/3422604.3425947&quot;&gt;TCPLS: Closely Integrating TCP and TLS&lt;/a&gt;
 Florentin Rochet (UCL Crypto Group); Emery Assogba and Olivier Bonaventure (UCLouvain)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tcpls-paper.png&quot; alt=&quot;tcpls paper&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can also &lt;a href=&quot;/images/tcpls-slides.pdf&quot;&gt;download a pdf version of his slides&lt;/a&gt; or &lt;a href=&quot;https://youtu.be/gkz-A9BDlqU?t=11139&quot;&gt;listen to his presentation on youtube&lt;/a&gt;.&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="tcpls" /><summary type="html">Florentin Rochet presented TCPLS on November 4th, 2020 at HotNets 2020: Nineteenth ACM Workshop on Hot Topics in Networks. The full paper is available from the ACM DL :</summary></entry><entry><title type="html">xBGP presented at Hotnets’20</title><link href="/xbgp/2020/11/05/xbgp-paper.html" rel="alternate" type="text/html" title="xBGP presented at Hotnets’20" /><published>2020-11-05T00:00:00+00:00</published><updated>2020-11-05T00:00:00+00:00</updated><id>/xbgp/2020/11/05/xbgp-paper</id><content type="html" xml:base="/xbgp/2020/11/05/xbgp-paper.html">&lt;p&gt;Thomas Wirtgen presented xBGP on November 4th, 2020 at &lt;a href=&quot;https://conferences.sigcomm.org/hotnets/2020/program.html&quot;&gt;HotNets 2020: Nineteenth ACM Workshop on Hot Topics in Networks&lt;/a&gt;. The full paper is available from the ACM DL :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dl.acm.org/doi/10.1145/3422604.3425952&quot;&gt;xBGP: When You Can’t Wait for the IETF and Vendors&lt;/a&gt;
 Thomas Wirtgen and Quentin De Coninck (UCLouvain); Randy Bush (Internet Initiative Japan &amp;amp; Arrcus, Inc); Laurent Vanbever (ETH Zürich); Olivier Bonaventure (UCLouvain)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/xbgp-paper.png&quot; alt=&quot;xbgp paper&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can also &lt;a href=&quot;/images/xbgp-slides.pdf&quot;&gt;download a pdf version of his slides&lt;/a&gt; or &lt;a href=&quot;https://youtu.be/gkz-A9BDlqU?t=3595&quot;&gt;listen to his presentation on youtube&lt;/a&gt;.&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="xbgp" /><summary type="html">Thomas Wirtgen presented xBGP on November 4th, 2020 at HotNets 2020: Nineteenth ACM Workshop on Hot Topics in Networks. The full paper is available from the ACM DL :</summary></entry><entry><title type="html">Source code for xBGP prototypes</title><link href="/xbgp/2020/11/04/source.html" rel="alternate" type="text/html" title="Source code for xBGP prototypes" /><published>2020-11-04T00:00:00+00:00</published><updated>2020-11-04T00:00:00+00:00</updated><id>/xbgp/2020/11/04/source</id><content type="html" xml:base="/xbgp/2020/11/04/source.html">&lt;p&gt;The source code for our xBGP prototype is available on github. It is divided in several repositories:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pluginized-protocols/libxbgp&quot;&gt;https://github.com/pluginized-protocols/libxbgp&lt;/a&gt; contains the libxbgp implementation which can be included in different BGP implementations&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pluginized-protocols/xbgp_bird&quot;&gt;https://github.com/pluginized-protocols/xbgp_bird&lt;/a&gt; contains the changes required to support xBGP in BIRD&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pluginized-protocols/xbgp_frr&quot;&gt;https://github.com/pluginized-protocols/xbgp_frr&lt;/a&gt; contains the changes required to support xBGP in FRRouting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition, we have collected several example xBGP plugins in the following repository:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pluginized-protocols/xbgp_plugins&quot;&gt;https://github.com/pluginized-protocols/xbgp_plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suggestions, comments and ideas are more than welcome !&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="xbgp" /><summary type="html">The source code for our xBGP prototype is available on github. It is divided in several repositories:</summary></entry><entry><title type="html">Source code for the TCPLS prototype</title><link href="/tcpls/2020/11/04/tcpls-source.html" rel="alternate" type="text/html" title="Source code for the TCPLS prototype" /><published>2020-11-04T00:00:00+00:00</published><updated>2020-11-04T00:00:00+00:00</updated><id>/tcpls/2020/11/04/tcpls-source</id><content type="html" xml:base="/tcpls/2020/11/04/tcpls-source.html">&lt;p&gt;The source code for the current TCPLS prototype is available on github. This prototype is a fork of the &lt;a href=&quot;https://github.com/h2o/picotls&quot;&gt;picotls&lt;/a&gt; implementation :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pluginized-protocols/picotcpls&quot;&gt;https://github.com/pluginized-protocols/picotcpls&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to the TCPLS prototype, we are also developing a library that will allow existing applications to use TCPLS without any modification.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pluginized-protocols/tcplslibconvert&quot;&gt;https://github.com/pluginized-protocols/tcplslibconvert&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This library is currently a work in progress, but suggestions, comments and ideas are more than welcome !&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="tcpls" /><summary type="html">The source code for the current TCPLS prototype is available on github. This prototype is a fork of the picotls implementation :</summary></entry><entry><title type="html">An abstract workflow for BGP implementations</title><link href="/xbgp/2020/10/07/xbgp.html" rel="alternate" type="text/html" title="An abstract workflow for BGP implementations" /><published>2020-10-07T00:00:00+00:00</published><updated>2020-10-07T00:00:00+00:00</updated><id>/xbgp/2020/10/07/xbgp</id><content type="html" xml:base="/xbgp/2020/10/07/xbgp.html">&lt;p&gt;The first step to allow BGP implementations to be programmed is to
have a clear understanding of how the BGP protocol operates and how it
processes and sends messages. If we ignore the establishment of BGP
sessions and the detection of failures, all BGP implementations need
to implement the workflow described in the figure below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bgp-arch.png&quot; alt=&quot;BGP workflow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This workflow corresponds to the abstraction description of the BGP
protocol in &lt;a href=&quot;https://tools.ietf.org/html/rfc4271&quot;&gt;RFC4271&lt;/a&gt;. It
illustrates the different datastructures that a BGP implementation
must maintain and how BGP messages are processed. BGP messages are
received on the left part of the figure and sent on the right. A BGP
router maintains one BGP session with each peer. It stores several
configuration parameters for each peer (IP address, AS Number, …)
and associates an import filter to each peer. These filters are
typically configured using vendor-specific commands or using NETCONF.
When a BGP message is received over a BGP session it first passes
through the import filter that may add or modify some of its
attributes (e.g. local-pref or communities). It may also decide to
discard the message (e.g. because it contains an invalid prefix). If
the BGP message is accepted by the import filter, it is stored in the
session’s BGP-Adj-RIB-In and then sent to the BGP-Loc-RIB. This RIB
contains all the routes received from the different peers and
accepted by their associated import filters. It is used by the BGP
decision process to select the best route towards each IP prefix. This
decision process is executed when a route is added or removed from the
BGP-Loc-RIB and when the routes towards BGP nexthops change. The
routes chosen by the BGP decision process are then pushed to the
router’s FIB and advertised to peers, subject to the per-session
export filters.&lt;/p&gt;

&lt;p&gt;Starting from this workflow, one can identify five critical points in
the processing of BGP messages. These points are identified with green
circles in the figure below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bgp-points.png&quot; alt=&quot;BGP insertion points&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The first of these points is the reception of a BGP message from a
peer. Several BGP extensions have defined new BGP attributes. This
point is the part of the BGP implementation that parses the BGP
message. To support a new BGP attribute, this is where a plugin could
add new code to parse and process a new BGP attribute.&lt;/p&gt;

&lt;p&gt;The second point corresponds to the import filters. This is a
important part of a BGP implementation. When a new BGP attribute is
defined, it typically needs to be supported in the import filter that
could for example add the attribute to a BGP message or use its
content in the filter.&lt;/p&gt;

&lt;p&gt;The third point is the BGP decision process. This is a key part of a
BGP implementation since network operators often need to tune the BGP
decision process and modify how the best route is selected. By
inserting plugins at this point, network operators&lt;/p&gt;

&lt;p&gt;The fourth point corresponds to the export filters. As for the import
filters, this is where new BGP attributes would be processed by the
filters.&lt;/p&gt;

&lt;p&gt;The last point is the encoding of the BGP messages that are sent to
peers. This is where a new BGP attribute would be written before being
sent on the wire.&lt;/p&gt;

&lt;p&gt;In following blog posts, we’ll describe how plugins can be attached to
these insertion points to support different types of BGP extensions.&lt;/p&gt;</content><author><name>Olivier Bonaventure</name></author><category term="xbgp" /><summary type="html">The first step to allow BGP implementations to be programmed is to have a clear understanding of how the BGP protocol operates and how it processes and sends messages. If we ignore the establishment of BGP sessions and the detection of failures, all BGP implementations need to implement the workflow described in the figure below.</summary></entry></feed>