Files
Christian Giese 00aa14c8e4 github pages
2024-03-25 22:01:36 +00:00

624 lines
47 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OSPF &mdash; BNG Blaster 0.8 documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=80d5e7a1" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=19f00094" />
<link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=a5c4661c" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=411f5019" />
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="../_static/jquery.js?v=5d32c60e"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../_static/documentation_options.js?v=a0e24af7"></script>
<script src="../_static/doctools.js?v=888ff710"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="MPLS" href="mpls.html" />
<link rel="prev" title="ISIS" href="isis.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
BNG Blaster
<img src="../_static/rtbrick_logo.png" class="logo" alt="Logo"/>
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../quickstart.html">Quickstart Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../interfaces.html">Interfaces</a></li>
<li class="toctree-l1"><a class="reference internal" href="../access/index.html">Access Protocols</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Routing Protocols</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="isis.html">ISIS</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">OSPF</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#configuration">Configuration</a></li>
<li class="toctree-l3"><a class="reference internal" href="#interfaces">Interfaces</a></li>
<li class="toctree-l3"><a class="reference internal" href="#neighbors">Neighbors</a></li>
<li class="toctree-l3"><a class="reference internal" href="#database">Database</a></li>
<li class="toctree-l3"><a class="reference internal" href="#flooding">Flooding</a></li>
<li class="toctree-l3"><a class="reference internal" href="#lsa-update-command">LSA Update Command</a></li>
<li class="toctree-l3"><a class="reference internal" href="#lsa-update-via-scapy">LSA Update via Scapy</a></li>
<li class="toctree-l3"><a class="reference internal" href="#mrt-files">MRT Files</a></li>
<li class="toctree-l3"><a class="reference internal" href="#lspgen">LSPGEN</a></li>
<li class="toctree-l3"><a class="reference internal" href="#ospfv3">OSPFv3</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="mpls.html">MPLS</a></li>
<li class="toctree-l2"><a class="reference internal" href="bgp.html">BGP</a></li>
<li class="toctree-l2"><a class="reference internal" href="ldp.html">LDP</a></li>
<li class="toctree-l2"><a class="reference internal" href="lspgen.html">LSPGEN</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../streams.html">Traffic Streams</a></li>
<li class="toctree-l1"><a class="reference internal" href="../http.html">HTTP Emulation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../nat.html">NAT / CGNAT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../reports.html">Reports</a></li>
<li class="toctree-l1"><a class="reference internal" href="../configuration/index.html">Configuration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API/CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../controller.html">Controller</a></li>
<li class="toctree-l1"><a class="reference internal" href="../performance.html">Performance Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting.html">Troubleshooting</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq.html">Frequently Asked Questions</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">BNG Blaster</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Routing Protocols</a></li>
<li class="breadcrumb-item active">OSPF</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/routing/ospf.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="ospf">
<span id="id1"></span><h1>OSPF<a class="headerlink" href="#ospf" title="Link to this heading"></a></h1>
<p>OSPF (Open Shortest Path First) is a dynamic Interior Gateway Protocol (IGP)
widely used in large computer networks. It efficiently determines the best paths
for data transmission, adapting to network changes in real-time. OSPFs link-state
algorithm builds a detailed network map, optimizing data delivery and
ensuring network stability.</p>
<p>There are two versions of OSPF: OSPFv2 and OSPFv3. OSPFv2 is used for IPv4 networks,
while OSPFv3 is designed specifically for IPv6 networks.</p>
<p>The BNG Blaster can emulate multiple OSPF instances of both versions, OSPFv2 and OSPFv3
(OSPFv3 is basically working but still under development).</p>
<p>An OSPF instance is a virtual OSPF node with one or more network interfaces attached. Such a
node behaves like a “real router” including database synchronization and flooding. Every
instance generates a <code class="docutils literal notranslate"><span class="pre">self</span></code> originated type 1 router LSA describing the node itself.</p>
<section id="configuration">
<h2>Configuration<a class="headerlink" href="#configuration" title="Link to this heading"></a></h2>
<p>Following an example OSPFv2 configuration with two instances
attached to two network interfaces.</p>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;interfaces&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;network&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;interface&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;eth1&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;address&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.1.2/30&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;gateway&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.1.1&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;ospfv2-instance-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;ospfv2-type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;p2p&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;interface&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;eth2&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;address&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.2.2/24&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;gateway&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.2.1&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;ospfv2-instance-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;ospfv2-type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;broadcast&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;ospf&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;instance-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;router-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.0.11&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;hostname&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;R1&quot;</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;instance-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;router-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.0.12&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;hostname&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;R2&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;ospf&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="p">}</span>
</pre></div>
</div>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Attribute</p></th>
<th class="head"><p>Description</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><strong>instance-id</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF instance identifier.</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>version</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF version.</div>
<div class="line">Default: 2</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>auth-key</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF authentication key.</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>auth-type</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF authentication type (simple or md5).</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>hello-interval</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF hello interval in seconds.</div>
<div class="line">Default: 10 Range: 1 - 65535</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>dead-interval</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF dead interval in seconds.</div>
<div class="line">Default: 40 Range: 1 - 65535</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>lsa-retry-interval</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF LSA retry interval in seconds.</div>
<div class="line">Default: 5 Range: 1 - 65535</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>hostname</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF hostname.</div>
<div class="line">Default: bngblaster</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>router-id</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF router identifier.</div>
<div class="line">Default: 10.10.10.10</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>router-priority</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF router priority.</div>
<div class="line">Default: 64 Range: 0 - 255</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>area</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF area.</div>
<div class="line">Default: 0.0.0.0</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>sr-base</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF SR base.</div>
<div class="line">Default: 0 Range: 0 - 1048575</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>sr-range</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF SR range.</div>
<div class="line">Default: 0 Range: 0 - 1048575</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>sr-node-sid</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF SR node SID.</div>
<div class="line">Default: 0 Range: 0 - 1048575</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>teardown-time</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF teardown time in seconds.</div>
<div class="line">Default: 5 Range: 0 - 65535</div>
</div>
</td>
</tr>
</tbody>
</table>
<p>The support for multiple instances allows different use cases. One example might
be to create two instances connected to the device or network under test. Now
inject an LSA on one instance and check if learned over the tested network on
the other instance.</p>
<p>Every OSPF instance can be also connected to an emulated link state graph loaded
by MRT files as shown in the example below.</p>
<img alt="OSPF" src="../_images/bbl_ospf.png" />
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;ospf&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;instance-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;router-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.0.11&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;hostname&quot;</span><span class="p">:</span><span class="w"> </span><span class="nt">&quot;R1&quot;</span>
<span class="w"> </span><span class="nt">&quot;external&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;mrt-file&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;ospf.mrt&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;connections&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;router-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.10.0.1&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;local-ipv4-address&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.0.1&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;metric&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1000</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;ospf&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;external&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span>
</pre></div>
</div>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Attribute</p></th>
<th class="head"><p>Description</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><strong>purge</strong></p></td>
<td><div class="line-block">
<div class="line">Automatically purge all external LSA during teardown.</div>
<div class="line">Default: true</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>mrt-file</strong></p></td>
<td><div class="line-block">
<div class="line">OSPF MRT file.</div>
</div>
</td>
</tr>
</tbody>
</table>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;ospf&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;external&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;connections&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span>
</pre></div>
</div>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Attribute</p></th>
<th class="head"><p>Description</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><strong>router-id</strong></p></td>
<td><div class="line-block">
<div class="line">Mandatory remote router identifier.</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>metric</strong></p></td>
<td><div class="line-block">
<div class="line">Optional interface metric.</div>
<div class="line">Default: 10 Range: 0 - 4294967295</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>local-ipv4-address</strong></p></td>
<td><div class="line-block">
<div class="line">Mandatory local IPv4 address (OSPFv2 only).</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><p><strong>local-interface-id</strong></p></td>
<td><div class="line-block">
<div class="line">Local interface identifier (OSPFv3 only).</div>
<div class="line">Default: 1 (2, 3, …)</div>
</div>
</td>
</tr>
<tr class="row-even"><td><p><strong>neighbor-interface-id</strong></p></td>
<td><div class="line-block">
<div class="line">Remote interface identifier (OSPFv3 only).</div>
<div class="line">Default: <cite>local-interface-id</cite></div>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section id="interfaces">
<h2>Interfaces<a class="headerlink" href="#interfaces" title="Link to this heading"></a></h2>
<p>The BNG Blaster supports P2P and broadcast interfaces only.</p>
<p>The following command returns detailed informations about all
OSPF interfaces associated with the given OSPF instance (e.g. instance 1).</p>
<p><code class="docutils literal notranslate"><span class="pre">$</span> <span class="pre">sudo</span> <span class="pre">bngblaster-cli</span> <span class="pre">run.sock</span> <span class="pre">ospf-interfaces</span> <span class="pre">instance</span> <span class="pre">1</span></code></p>
</section>
<section id="neighbors">
<h2>Neighbors<a class="headerlink" href="#neighbors" title="Link to this heading"></a></h2>
<p>The following command returns detailed informations about all
OSPF neighbors associated with the given OSPF instance (e.g. instance 1).</p>
<p><code class="docutils literal notranslate"><span class="pre">$</span> <span class="pre">sudo</span> <span class="pre">bngblaster-cli</span> <span class="pre">run.sock</span> <span class="pre">ospf-neighbors</span> <span class="pre">instance</span> <span class="pre">1</span></code></p>
</section>
<section id="database">
<h2>Database<a class="headerlink" href="#database" title="Link to this heading"></a></h2>
<p>The BNG Blaster distinguishes between three different source types of
LSA entries in the OSPF database.</p>
<p>The type <code class="docutils literal notranslate"><span class="pre">self</span></code> is used for the self-originated LSA describing the own
BNG Blaster OSPF instance. LSP entries of type <code class="docutils literal notranslate"><span class="pre">adjacency</span></code> are learned
from OSPF neighbors. The type <code class="docutils literal notranslate"><span class="pre">external</span></code> is used for those LSA entries
learned via MRT files or injected via <code class="docutils literal notranslate"><span class="pre">ospf-lsa/pdu-update</span></code> <a class="reference internal" href="../api/index.html#api"><span class="std std-ref">command</span></a>.</p>
<p><code class="docutils literal notranslate"><span class="pre">$</span> <span class="pre">sudo</span> <span class="pre">bngblaster-cli</span> <span class="pre">run.sock</span> <span class="pre">ospf-database</span> <span class="pre">instance</span> <span class="pre">1</span></code></p>
<p>The BNG Blaster automatically purges all LSAs of type
<code class="docutils literal notranslate"><span class="pre">self</span></code> and <code class="docutils literal notranslate"><span class="pre">external</span></code> during teardown. This is done by
generating LSAs with newer sequence numbers and max age.</p>
</section>
<section id="flooding">
<h2>Flooding<a class="headerlink" href="#flooding" title="Link to this heading"></a></h2>
<p>The BNG Blaster floods LSAs received to all other active
neighbors of the OSPF instance except to those with neighbor
router-id equal to the source router-id of the LSA.</p>
</section>
<section id="lsa-update-command">
<h2>LSA Update Command<a class="headerlink" href="#lsa-update-command" title="Link to this heading"></a></h2>
<p>It is also possible to inject LSAs using the <code class="docutils literal notranslate"><span class="pre">ospf-lsa-update</span></code> <a class="reference internal" href="../api/index.html#api"><span class="std std-ref">command</span></a>.</p>
<p>This <a class="reference internal" href="../api/index.html#api"><span class="std std-ref">command</span></a> expects a list of hex encoded LSA including
the OSPF LSA common header (<code class="docutils literal notranslate"><span class="pre">|</span> <span class="pre">LS</span> <span class="pre">age</span> <span class="pre">|</span> <span class="pre">Options</span> <span class="pre">|</span> <span class="pre">LS</span> <span class="pre">type</span> <span class="pre">|</span></code>).</p>
<p><code class="docutils literal notranslate"><span class="pre">$</span> <span class="pre">cat</span> <span class="pre">command.json</span> <span class="pre">|</span> <span class="pre">jq</span> <span class="pre">.</span></code></p>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;command&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;ospf-lsa-update&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;arguments&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;instance&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;lsa&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="s2">&quot;000100050ac801000aff010180000001e7790024ffffff00000000140000000000000000&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="s2">&quot;000100050ac802000aff010180000001dc830024ffffff00000000140000000000000000&quot;</span>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The command <code class="docutils literal notranslate"><span class="pre">ospf-pdu-update</span></code> work similar to <code class="docutils literal notranslate"><span class="pre">ospf-lsa-update</span></code> expecting OSPF LS update
request PDU including OSPF common header (<code class="docutils literal notranslate"><span class="pre">|</span> <span class="pre">Version</span> <span class="pre">|</span> <span class="pre">Type</span> <span class="pre">|</span></code>).</p>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;command&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;ospf-pdu-update&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;arguments&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;instance&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;pdu&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="s2">&quot;020400400101010100000000456e0000000000000000000000000001000100050ac80c000aff01018000012d13160024ffffff00000000140000000000000000&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="s2">&quot;0204004001010101000000003b780000000000000000000000000001000100050ac80b000aff01018000012d1e0c0024ffffff00000000140000000000000000&quot;</span>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="lsa-update-via-scapy">
<h2>LSA Update via Scapy<a class="headerlink" href="#lsa-update-via-scapy" title="Link to this heading"></a></h2>
<p>The following example shows how to generate LSAs via Scapy
and inject them using the ospf-lsa-update <a class="reference internal" href="../api/index.html#api"><span class="std std-ref">command</span></a>.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">from</span> <span class="nn">scapy.contrib.ospf</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">def</span> <span class="nf">error</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;print error and exit&quot;&quot;&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">execute_command</span><span class="p">(</span><span class="n">socket_path</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">socket_path</span><span class="p">):</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_UNIX</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">client</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">socket_path</span><span class="p">)</span>
<span class="n">client</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">request</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
<span class="n">data</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">junk</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
<span class="k">if</span> <span class="n">junk</span><span class="p">:</span>
<span class="n">data</span> <span class="o">+=</span> <span class="n">junk</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">break</span>
<span class="nb">print</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">error</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">error</span><span class="p">(</span><span class="s2">&quot;socket </span><span class="si">%s</span><span class="s2"> not found&quot;</span> <span class="o">%</span> <span class="n">socket_path</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;main function&quot;&quot;&quot;</span>
<span class="n">socket_path</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">command</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;command&quot;</span><span class="p">:</span> <span class="s2">&quot;ospf-lsa-update&quot;</span><span class="p">,</span>
<span class="s2">&quot;arguments&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;instance&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s2">&quot;lsa&quot;</span><span class="p">:</span> <span class="p">[]</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">lsa</span> <span class="o">=</span> <span class="n">OSPF_External_LSA</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;10.200.1.0&quot;</span><span class="p">,</span> <span class="n">adrouter</span><span class="o">=</span><span class="s2">&quot;10.255.1.1&quot;</span><span class="p">,</span> <span class="n">mask</span><span class="o">=</span><span class="s2">&quot;255.255.255.0&quot;</span><span class="p">,</span> <span class="n">seq</span><span class="o">=</span><span class="mi">2147483649</span><span class="p">)</span>
<span class="n">command</span><span class="p">[</span><span class="s2">&quot;arguments&quot;</span><span class="p">][</span><span class="s2">&quot;lsa&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lsa</span><span class="o">.</span><span class="n">build</span><span class="p">()</span><span class="o">.</span><span class="n">hex</span><span class="p">())</span>
<span class="n">lsa</span> <span class="o">=</span> <span class="n">OSPF_External_LSA</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;10.200.2.0&quot;</span><span class="p">,</span> <span class="n">adrouter</span><span class="o">=</span><span class="s2">&quot;10.255.1.1&quot;</span><span class="p">,</span> <span class="n">mask</span><span class="o">=</span><span class="s2">&quot;255.255.255.0&quot;</span><span class="p">,</span> <span class="n">seq</span><span class="o">=</span><span class="mi">2147483649</span><span class="p">)</span>
<span class="n">command</span><span class="p">[</span><span class="s2">&quot;arguments&quot;</span><span class="p">][</span><span class="s2">&quot;lsa&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lsa</span><span class="o">.</span><span class="n">build</span><span class="p">()</span><span class="o">.</span><span class="n">hex</span><span class="p">())</span>
<span class="n">execute_command</span><span class="p">(</span><span class="n">socket_path</span><span class="p">,</span> <span class="n">command</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
</section>
<section id="mrt-files">
<h2>MRT Files<a class="headerlink" href="#mrt-files" title="Link to this heading"></a></h2>
<p>The BNG Blaster can load LSA updates from a MRT file as defined in
<a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc6396">RFC6396</a>.</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Subtype |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message... (variable)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</pre></div>
</div>
<p>The message field contains the complete OSPF LS Update PDU including
the OSPF common header starting with version field.</p>
<p>Those files can be loaded at startup via the configuration option
<code class="docutils literal notranslate"><span class="pre">&quot;ospf&quot;:</span> <span class="pre">{</span> <span class="pre">&quot;external&quot;:</span> <span class="pre">{</span> <span class="pre">&quot;mrt-file&quot;:</span> <span class="pre">&quot;&lt;file&gt;&quot;</span> <span class="pre">}</span> <span class="pre">}</span></code> or alternative
via <code class="docutils literal notranslate"><span class="pre">ospf-load-mrt</span></code> <a class="reference internal" href="../api/index.html#api"><span class="std std-ref">command</span></a>.</p>
<p><code class="docutils literal notranslate"><span class="pre">$</span> <span class="pre">sudo</span> <span class="pre">bngblaster-cli</span> <span class="pre">run.sock</span> <span class="pre">ospf-load-mrt</span> <span class="pre">file</span> <span class="pre">ospf.mrt</span> <span class="pre">instance</span> <span class="pre">1</span></code></p>
<p>The following example shows how to generate such MRT file via Scapy.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">struct</span>
<span class="kn">from</span> <span class="nn">scapy.contrib.ospf</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;main function&quot;&quot;&quot;</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;ospf.mrt&quot;</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
<span class="n">lsa</span> <span class="o">=</span> <span class="n">OSPF_External_LSA</span><span class="p">(</span><span class="nb">type</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;10.222.</span><span class="si">%s</span><span class="s2">.0&quot;</span> <span class="o">%</span> <span class="n">i</span><span class="p">,</span> <span class="n">adrouter</span><span class="o">=</span><span class="s2">&quot;10.255.1.1&quot;</span><span class="p">,</span> <span class="n">mask</span><span class="o">=</span><span class="s2">&quot;255.255.255.0&quot;</span><span class="p">,</span> <span class="n">seq</span><span class="o">=</span><span class="mi">2147483949</span><span class="p">)</span>
<span class="n">ospf</span> <span class="o">=</span> <span class="n">OSPF_Hdr</span><span class="p">()</span><span class="o">/</span><span class="n">OSPF_LSUpd</span><span class="p">(</span><span class="n">lsacount</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">lsa</span>
<span class="n">pdu</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;!II&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="n">ospf</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
<span class="n">mrt</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;!IHHI&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">pdu</span><span class="p">))</span> <span class="o">+</span> <span class="n">pdu</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">mrt</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
</section>
<section id="lspgen">
<h2>LSPGEN<a class="headerlink" href="#lspgen" title="Link to this heading"></a></h2>
<p>The BNG Blaster includes a tool called <a class="reference internal" href="lspgen.html#lspgen"><span class="std std-ref">lspgen</span></a>, which is able to generate
topologies and link state packets for export as MRT and PCAP files. This tool
is also able to inject LSAs directly using the <code class="docutils literal notranslate"><span class="pre">ospf-pdu-update</span></code>
<a class="reference internal" href="../api/index.html#api"><span class="std std-ref">command</span></a>.</p>
</section>
<section id="ospfv3">
<h2>OSPFv3<a class="headerlink" href="#ospfv3" title="Link to this heading"></a></h2>
<p>The BNG Blaster also provides support for OSPFv3, although it should be noted that
its support, compared to OSPFv2, is still considered experimental.</p>
<p>Conceptually, OSPFv2 and OSPFv3 function the same way in the BNG Blaster, and the
basic configuration differs only in the version number. The control commands are
also identical.</p>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;interfaces&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;network&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;interface&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;eth1&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;address-ipv6&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;fc66:1337:60::2/64&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;gateway-ipv6&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;fc66:1337:60::1&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;ospfv3-instance-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;ospfv3-type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;p2p&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;ospf&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;instance-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;router-id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;10.0.0.16&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;hostname&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;R6&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="isis.html" class="btn btn-neutral float-left" title="ISIS" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="mpls.html" class="btn btn-neutral float-right" title="MPLS" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2020-2024, RtBrick, Inc..</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>