diff --git a/.gitignore b/.gitignore
index 7809bf7..726c293 100644
--- a/.gitignore
+++ b/.gitignore
@@ -136,3 +136,5 @@ sympy-plots-for-*.tex/
*.bak
*.sav
+*.xdv
+*.pdf
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d4f86bd
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,31 @@
+TARGET=slides.pdf
+
+SVGS=$(wildcard imgs/*.svg)
+SVG_PDFTEXS = $(patsubst imgs/%,imgs/pdf_tex/%,$(SVGS:.svg=.pdf_tex))
+SVG_PDF = $(patsubst imgs/%,imgs/pdf/%,$(SVGS:.svg=.pdf))
+AUTOGEN_SVGS_LIST=mac
+AUTOGEN_SVGS=$(addprefix imgs/_autogen/,$(AUTOGEN_SVGS_LIST))
+
+all: $(SVG_PDFTEXS) $(SVG_PDF) $(AUTOGEN_SVGS) $(TARGET)
+
+%.pdf: %.tex
+ latexmk -pdfxe $<
+
+imgs/_autogen/%: imgs/%.svg
+ imgs/split_layers.py "$*.svg"
+ cd "$@" ; inkscape --export-type=pdf *.svg
+
+imgs/pdf_tex/%.pdf_tex: imgs/%.svg
+ mkdir -p "imgs/pdf_tex"
+ inkscape "$<" -o "$(@:.pdf_tex=.pdf)" --export-latex 2>/dev/null
+ sed -i 's#\($(patsubst imgs/pdf_tex/%,%,$(@:.pdf_tex=.pdf))\)#imgs/pdf_tex/\1#g' $@
+
+imgs/pdf/%.pdf: imgs/%.svg
+ mkdir -p "imgs/pdf"
+ inkscape "$<" -o "$@" 2>/dev/null
+
+.PHONY: clean
+clean:
+ latexmk -C
+ rm -rf "imgs/pdf_tex" "imgs/pdf"
+ rm -rf imgs/_autogen
diff --git a/imgs/.gitignore b/imgs/.gitignore
new file mode 100644
index 0000000..80f3b37
--- /dev/null
+++ b/imgs/.gitignore
@@ -0,0 +1,3 @@
+_autogen
+pdf
+pdf_tex
diff --git a/imgs/mac.svg b/imgs/mac.svg
new file mode 100644
index 0000000..7e38ddb
--- /dev/null
+++ b/imgs/mac.svg
@@ -0,0 +1,1140 @@
+
+
diff --git a/imgs/routing.svg b/imgs/routing.svg
new file mode 100644
index 0000000..cbc2c25
--- /dev/null
+++ b/imgs/routing.svg
@@ -0,0 +1,532 @@
+
+
diff --git a/imgs/split_layers.py b/imgs/split_layers.py
new file mode 100755
index 0000000..f2cc9e2
--- /dev/null
+++ b/imgs/split_layers.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+
+from xml.etree import ElementTree as ET
+import sys
+from pathlib import Path
+
+IN_DIR = Path(__file__).parent
+OUT_DIR = IN_DIR / "_autogen"
+
+namespaces = {
+ "svg": "http://www.w3.org/2000/svg",
+ "inkscape": "http://www.inkscape.org/namespaces/inkscape",
+}
+
+splits = {
+ "mac.svg": {
+ "_always": ["Base", "Key"],
+ "0": [],
+ "1": ["Routing table"],
+ "2": ["Routing table", "Routing table - select"],
+ "3": ["Yellow router"],
+ "4": ["Yellow router", "ARP query"],
+ "5": ["Yellow router", "ARP query", "ARP answer"],
+ "6": ["Yellow router", "Outbound packet"],
+ }
+}
+
+
+def process_svg(svg_splits, path, out_path):
+ out_path.mkdir(parents=True, exist_ok=True)
+ always = svg_splits.get("_always", [])
+
+ svg = ET.parse(path.as_posix())
+
+ for keyframe in svg_splits:
+ if keyframe.startswith("_"): # special value -- eg `_always`
+ continue
+ layers = always + svg_splits[keyframe]
+
+ for layer_node in svg.findall(
+ ".//svg:g[@inkscape:groupmode='layer']", namespaces=namespaces
+ ):
+ layer_node.attrib["style"] = "display:none"
+ for layer_name in layers:
+ layer = svg.find(
+ ".//svg:g[@inkscape:groupmode='layer'][@inkscape:label='{}']".format(
+ layer_name
+ ),
+ namespaces=namespaces,
+ )
+ if not layer:
+ raise Exception("Layer {} not found".format(layer_name))
+ layer.attrib["style"] = "display:inline"
+
+ keyframe_outpath = out_path / "{}.svg".format(keyframe)
+ svg.write(keyframe_outpath.as_posix(), encoding="utf-8")
+ print("Written {}".format(keyframe_outpath.as_posix()))
+
+
+def main():
+ processlist = []
+ if len(sys.argv) < 2:
+ processlist = splits.keys()
+ else:
+ processlist = [sys.argv[1]]
+
+ for svg_path in processlist:
+ process_svg(
+ splits[svg_path], IN_DIR / svg_path, OUT_DIR / (Path(svg_path).stem)
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/slides.tex b/slides.tex
new file mode 100644
index 0000000..bf359eb
--- /dev/null
+++ b/slides.tex
@@ -0,0 +1,81 @@
+% vim: spell spelllang=en
+
+\documentclass[11pt,xcolor={usenames,dvipsnames},aspectratio=169]{beamer}
+\usetheme{metropolis}
+\usepackage[utf8]{inputenc}
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+
+\usepackage{texlib/my_listings}
+\usepackage{texlib/todo}
+
+\usepackage{booktabs}
+\usepackage[normalem]{ulem}
+
+%\usepackage{inconsolata}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\title{Announcing IPv4 routes with an IPv6 next-hop in the Babel
+routing protocol}
+\subtitle{\textit{aka.} draft-bastian-babel-v4ov6}
+\author[\slidecountline]
+{Théophile Bastian, Juliusz Chroboczek}
+\date{}
+%\subject{}
+%\logo{}
+\institute{
+ \href{https://ens.fr/}{ENS Paris},
+ \href{https://www.irif.fr/}{IRIF},
+ \href{https://www.nexedi.com/}{Nexedi}}
+
+\begin{document}
+
+\maketitle{}
+
+\begin{frame}{Traditional routing}
+ \begin{align*}
+ \text{Network prefix (IPvX)} &\longrightarrow \text{Next-Hop (IPvX)}
+ \end{align*}
+
+ \pause{}
+
+ \begin{table}
+ \centering
+ \textbf{IPv4 routing table} \\
+ \medskip
+ \begin{tabular}{@{} lcl @{}}
+ \toprule
+ Prefix & $\rightarrow$ & Next-Hop \\
+ \midrule
+ default & & 10.42.0.254 \\
+ 10.102.0.0/16 & & 10.102.0.1 \\
+ 10.102.10.0/24 & & 10.102.10.1 \\
+ \only<3>{10.0.0.0/8 & & \sout{fd80:1::1}} \\
+ \bottomrule
+ \end{tabular}
+ \end{table}
+
+ \todo{Better strikeout}
+\end{frame}
+
+\begin{frame}{The router's job}
+ \begin{figure}
+ \centering
+ \includegraphics[width=\columnwidth]{imgs/pdf/routing.pdf}
+ \end{figure}
+\end{frame}
+
+\begin{frame}{What's under the hull?}
+ \begin{figure}
+ \centering
+ \only<0>{\includegraphics[width=\columnwidth]{imgs/_autogen/mac/0.pdf}}
+ \only<1>{\includegraphics[width=\columnwidth]{imgs/_autogen/mac/1.pdf}}
+ \only<2>{\includegraphics[width=\columnwidth]{imgs/_autogen/mac/2.pdf}}
+ \only<3>{\includegraphics[width=\columnwidth]{imgs/_autogen/mac/3.pdf}}
+ \only<4>{\includegraphics[width=\columnwidth]{imgs/_autogen/mac/4.pdf}}
+ \only<5>{\includegraphics[width=\columnwidth]{imgs/_autogen/mac/5.pdf}}
+ \only<6>{\includegraphics[width=\columnwidth]{imgs/_autogen/mac/6.pdf}}
+ \end{figure}
+\end{frame}
+
+\end{document}
diff --git a/texlib/my_listings.sty b/texlib/my_listings.sty
new file mode 100644
index 0000000..f720a6d
--- /dev/null
+++ b/texlib/my_listings.sty
@@ -0,0 +1,63 @@
+\usepackage{listings}
+\usepackage{algorithmicx}
+\usepackage{algpseudocode}
+\usepackage{color}
+\usepackage{xcolor}
+\usepackage{courier}
+\definecolor{color_comment}{HTML}{2D6F19}
+\definecolor{color_linenum}{HTML}{9E9E9E}
+\definecolor{color_strings}{HTML}{D300F3}
+
+
+\lstset{ %
+% backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}
+ basicstyle=\footnotesize\ttfamily, % the size of the fonts that are used for the code
+ breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
+ breaklines=true, % sets automatic line breaking
+ captionpos=b, % sets the caption-position to bottom
+ commentstyle=\color{color_comment}, % comment style
+% deletekeywords={...}, % if you want to delete keywords from the given language
+% escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
+ extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8
+ frame=none, % adds a frame around the code
+ keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
+ keywordstyle=\color{blue}, % keyword style
+ morekeywords={*,...}, % if you want to add more keywords to the set
+ numbers=left, % where to put the line-numbers; possible values are (none, left, right)
+ numbersep=5pt, % how far the line-numbers are from the code
+ numberstyle=\tiny\color{color_linenum}, % the style that is used for the line-numbers
+ rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
+ showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
+ showstringspaces=false, % underline spaces within strings only
+ showtabs=false, % show tabs within strings adding particular underscores
+ stepnumber=1, % the step between two line-numbers. If it's 1, each line will be numbered
+ stringstyle=\color{color_strings}, % string literal style
+ tabsize=4, % sets default tabsize to 2 spaces
+% title=\lstname, % show the filename of files included with \lstinputlisting; also try caption instead of title
+% inputencoding=utf8/latin1 % To accept utf8 encoding
+}
+
+\lstset{literate=
+ {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
+ {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
+ {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
+ {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
+ {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
+ {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
+ {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
+ {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
+ {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
+ {ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1
+ {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
+ {€}{{\EUR}}1 {£}{{\pounds}}1 {¬}{{$\lnot$}}1 {∞}{{$\infty$}}1
+}
+
+\newcommand{\true}{\lstinline$true$}
+\newcommand{\false}{\lstinline$false$}
+
+\newcommand{\lstbash}[1]{\lstinline[language=bash]$#1$}
+\newcommand{\lstocaml}[1]{\lstinline[language=Caml]$#1$}
+\newcommand{\lstcpp}[1]{\lstinline[language=C++]$#1$}
+\newcommand{\lstc}[1]{\lstinline[language=C]$#1$}
+\newcommand{\lstpython}[1]{\lstinline[language=python]$#1$}
+
diff --git a/texlib/todo.sty b/texlib/todo.sty
new file mode 100644
index 0000000..05076cb
--- /dev/null
+++ b/texlib/todo.sty
@@ -0,0 +1,11 @@
+\RequirePackage{xcolor}
+
+\definecolor{todobg}{HTML}{FF5F00}
+\definecolor{todofg}{HTML}{3700DA}
+\definecolor{notebg}{HTML}{87C23C}
+\definecolor{notefg}{HTML}{BC3423}
+
+\newcommand{\qtodo}[1]{\colorbox{todobg}{\textcolor{todofg}{#1}}}
+\newcommand{\todo}[1]{\qtodo{\textbf{TODO:}\,#1}}
+\newcommand{\qnote}[1]{\colorbox{notebg}{\textcolor{notefg}{#1}}}
+\newcommand{\tnote}[1]{\qnote{\textbf{NOTE:}\,#1}}