Development	  of	  vxlan(4)	  using	  rump	  kernel
Kazuya	  GODA	  (k-­‐goda@iij.ad.jp)

Introduction• I’m	  porting	  vxlan(4)	  from	  FreeBSD	  	  • This	  working	  uses	  rump	  kernel	  for	  developing	  • I	  talk	  about	  how	  do	  I	  developed	  vxlan(4)	  using	  rump	  kernel	  Whatʼs vxlan ?
• vxlan	  – A Layer	  2	  overlay	  scheme	  over	  a	  Layer	  3	  network	  – It	  uses	  MAC-­‐in-­‐UDP	  encapsulation	  http://www.cisco.com/web/JP/product/hs/switches/nexus1000/prodlit/images/data_sheet_c78-­‐492971-­‐11.jpg

Development of vxlan(4) using rumpkernel
1. Setup	  development	  environment	  – Build	  and	  run	  rump	  kernel	  – Access	  host’s	  network	  2. Develop	  – Kernel	  – Userland	  3. Debug	  Development of vxlan(4) using rumpkernel
1. Setup	  development	  environment	  – Build	  and	  run	  rump	  kernel	  – Access	  host’s	  network	  2. Develop	  – Kernel	  – Userland	  3. Debug	  Building rump kernel• buildrump.sh	  	  – Utilities	  for	  building	  NetBSD	  kernel	  drivers	  as	  rump	  kernels	  for	  a	  variety	  of	  systems	  – https://github.com/rumpkernel/buildrump.sh	  • buildrump.sh	  options	  – for	  using	  local	  source	  tree	  options

argument-­‐ssource	  tree	  directory– for	  debugging	  options
append	  ﬂags	  -­‐D-­‐O2	  -­‐g-­‐DD-­‐DDEBUG-­‐DDD-­‐DLOCKDEBUG

Building & Running rump kernel$	  ./buildrump.sh	  -­‐DDD	  -­‐s	  ../netbsd-­‐src	  fullbuild	  >>	  NATIVE	  build	  environment	  probed	  >>	  >>	  NOTICE:	  Not	  a	  buildrump.sh-­‐based	  repo	  in	  /home/k-­‐goda/rumpkerneldev/netbsd-­‐src	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  :	  $	  ./buildrump.sh/rump/bin/rump_server	  -­‐lrumpnet	  -­‐lrumpnet_net	  -­‐lrumpnet_netinet	  -­‐lrumpnet_virtif	  	  unix://ctrl	  	  $	  rump.ifconﬁg	  	  lo0:	  ﬂags=8049<UP,LOOPBACK,RUNNING,MULTICAST>	  mtu	  33648	  	  	  	  	  	  	  	  inet	  127.0.0.1	  netmask	  0xﬀ000000	  	  $	  rump.route	  show	  Routing	  tables	  Internet:	  Destination	  	  	  	  	  	  	  	  Gateway	  	  	  	  	  	  	  	  	  	  	  	  Flags	  	  	  	  Refs	  	  	  	  	  	  Use	  	  	  	  Mtu	  Interface	  localhost	  	  	  	  	  	  	  	  	  	  localhost	  	  	  	  	  	  	  	  	  	  UH	  	  	  	  	  	  	  	  	  	  -­‐	  	  	  	  	  	  	  	  -­‐	  	  33648	  	  lo0	  	  Access the hostʼs networking• We	  would	  like	  to	  communicate	  with	  each	  other	  hosts	  because	  of	  testing	  	  	  • A	  rump	  kernel	  networking	  is	  separated	  from	  host’s	  one	  • Using	  virt(4)	  in	  rump	  kernel	  and	  bridging	  host’s	  tap	  and	  physical	  interface	  – virt	  interface	  is	  mapped	  host’s	  tap	  interface	  Access the hostʼs networking
rump	  kernel	  side	  host	  side	  #	  rump.ifconﬁg	  virt0	  create	  #	  rump.ifconﬁg	  virt0	  192.168.100.1/24	  #	  ifconﬁg	  tap0	  create	  up	  #	  ifconﬁg	  bridge0	  create	  up	  #	  brconﬁg	  bridge0	  add	  tap0	  add	  wm0-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	  2

4

1

4

192.168.100.1

4(-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	  )

1
2

4

4

#
192.168.100.2

Development of vxlan(4) using rumpkernel
1. Setup	  development	  environment	  – Build	  rump	  kernel	  – 	  Access	  host’s	  network	  2. Develop	  – Kernel	  – Userland	  program	  3. Debug	  Create and Modify Files• userland	  side	  ﬁlepathcreate sbin/ifconﬁg/vxlan.c

ifconﬁg	  command	  extension	  for	  vxlan(4)• kernel	  side	  
ﬁle

path

createsys/net/if_vxlan.cvxlan(4)	  component

createsys/net/if_vxlan.hvxlan(4)	  header	  ﬁlemodify sys/netinet/udp_usrreq.c

add	  udpcb	  and	  encap	  udp	  tunneling	  proto	  pathmodify sys/netinet/udp_var.hadd	  udpcb• rump	  kernel	  side	  ﬁlepathcreatesys/rump/net/Makeﬁle.rumpnetcomp

createsys/rump/net/lib/libvxlan/vxlan_component.ccreatesys/rump/net/lib/libvxlan/Makeﬁlekernel• kernel	  side	  – A	  implementation	  of	  vxlan(4)	  is	  typically	  developed	  without	  concern	  for	  rump	  kernel	  	  • rump	  kernel	  side	  – We	  need	  to	  build	  driver	  components	  to	  librump	  libraries	  • vxlan	  driver	  is	  named	  librumpnet_vxlan	  – Make	  ﬁles	  • sys/rump/net/lib/libvxlan/vxlan_component.c	  • sys/rump/net/lib/libvxlan/Makeﬁle	  Inside of vxlan̲componet.c#include	  <sys/param.h>	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  #include	  "rump_private.h"	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  #include	  "rump_net_private.h"	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  int	  vxlanattach(int);	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  RUMP_COMPONENT(RUMP_COMPONENT_NET_IF)	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  {	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  vxlanattach(0);	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  }	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  userland side
• A implementation	  of	  ifconﬁg	  vxlan	  extension	  is	  typically	  developed	  without	  concern	  for	  rump	  kernel	  • Build	  for	  using	  normal	  tool	  chain,	  output	  ifconﬁg	  and	  rump.ifconﬁg	  • using	  rump.ifconﬁg	  for	  rump	  kernel	  Development of vxlan(4) using rumpkernel
1. Setup	  development	  environment	  – Build	  rump	  kernel	  – 	  Access	  host’s	  network	  2. Develop	  – Kernel	  – Userland	  program	  3. Debug	  Debug• Using	  gdb	  	  – A	  rump	  kernel	  is	  userland	  process	  • Called	  panic(9)	  in	  kernel, rump	  kernel	  call	  abort(3)	  and	  exit	  – We	  can	  get	  panic	  message	  but	  can’t	  get	  backtrace…	  	  • insert	  backtrace(3)	  linrumpuser	  but	  it	  not	  good	  solution	  	  	  	  (if possible) DEMO
• a	  rump	  kernel	  on	  host#1	  sends	  ping	  to	  host#2	  – the	  host#1	  is	  NetBSD,	  the	  host#2	  is	  FreeBSD	  	  ()4 210.10.99.1

1

192.168.100.1#21)
10.10.99.2

44

192.168.100.2

Thank	  you	  !!
I	  will	  publish	  the	  source	  code	  	  in	  the	  near	  term