Skip to content
This repository has been archived by the owner on Sep 18, 2021. It is now read-only.

Commit

Permalink
WIP SRv6 eval (2018.12.30-12:52)
Browse files Browse the repository at this point in the history
* Add transit
* Add vrf_redirect
* Add binding_sid (WIP: End.B6.Insert isn't working fine)
  • Loading branch information
Hirki Shirokura committed Dec 31, 2018
1 parent 82fa6c9 commit a2accbd
Show file tree
Hide file tree
Showing 34 changed files with 1,983 additions and 182 deletions.
17 changes: 15 additions & 2 deletions bin/tn
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,14 @@ node_configs:
echo slnakdev
test:
- cmds:
- name: p2p
cmds:
- cmd: docker exec C0 ping -c2 10.0.0.2
- cmd: echo slankdev slankdev
- name: lo
cmds:
- cmd: docker exec C0 ping -c2 10.255.0.1
- cmd: echo slankdev slankdev
'''

text__mount_docker_netns='''
Expand Down Expand Up @@ -473,6 +478,10 @@ def command_conf(args):
print('echo {}::[config]::fin'.format(node['name']))
postconf(appinfo.data)

def command_upconf(args):
command_up(args)
command_conf(args)

def command_reconf(args):
command_reup(args)
command_conf(args)
Expand Down Expand Up @@ -588,6 +597,10 @@ def main():
help='Execute config-cmd in a running container')
parser_conf.set_defaults(func=command_conf)

parser_reconf = subparsers.add_parser('upconf',
help='Create, start and config')
parser_reconf.set_defaults(func=command_upconf)

parser_reconf = subparsers.add_parser('reconf',
help='Stop, remove, create, start and config')
parser_reconf.set_defaults(func=command_reconf)
Expand Down Expand Up @@ -630,7 +643,7 @@ def main():
appinfo.command=args.command

need_data = {'ps', 'up', 'down', 'pull', 'exec',
'build', 'conf', 'reconf', 'reup', 'test', 'img'}
'build', 'conf', 'upconf', 'reconf', 'reup', 'test', 'img'}
if args.command in need_data:
try:
filename = appinfo.specfile
Expand Down
124 changes: 124 additions & 0 deletions examples/basic_srv6/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@

# Segment Routing IPv6 Examples

- **vpn-v4-per-ce**: IPv4 L3VPN [T.Encaps, End, End.DX4]
- **vpn-v6-per-ce**: IPv6 L3VPN [T.Encaps, End, End.DX6]
- **vpn-v4-per-vrf**: IPv4 L3VPN [T.Encaps, End, End.DT4] (WIP)
- **vpn-v6-per-vrf**: IPv6 L3VPN [T.Encaps, End, End.DT6]
- **l2vpn**: L2VPN [T.Encaps.L2, End, End.DX4] (XXX)
- **transit**: Transit Function Test with FRR, [T.Encaps, T.Insert, End, End.X]
- **vrf-redirect**: End.T Evaluation linux only without FRR, [End.T] (XXX)
- **binding-sid**: End.B6,End.B6.Encaps Evaluation. [End.B6, End.B6.Encaps] (WIP End.B6.Insert)
<!-- - **sfc**: Service Chaining with End.AM -->

## Functions I want to test on linux
- [x] T.Insert: I don't understand how-to-use
- [x] T.Encaps
- [x] T.Encaps.L2: I don't understand how-to-use
- [x] End
- [x] End.X
- [ ] End.T: linux kernel can't perform End.T fine. (XXX)
- [x] End.DX6
- [x] End.DX4
- [x] End.DX2
- [x] End.DT6
- [ ] End.DT4: linux kernel isn't support yet
- [x] End.B6: linux kernel isn't working fine..? or I don't understand how-to-use.
- [x] End.B6.Encaps
- [ ] End.AM: linux kernel isn't support yet. **srext only** masquerading proxy
- [ ] End.AD: linux kernel isn't support yes. **srext only** dynamic proxy
- [ ] End.AS2: linux kernel isn't support yes. static proxy
- [ ] End.AS4: linux kernel isn't support yes. static proxy
- [ ] End.AS6: linux kernel isn't support yes. static proxy

## Funcに関しての説明
- **T.Encaps:**<br>
この操作はトランジットノード
(すなわち、パケットを通してSRv6をサポートするルーターですが、
ノード自体はSegmentリストにありません)で実行され、
IPv6ヘッダーとSRHヘッダーをパケットの外側の層に追加し、
新しいものを定義できます。セグメントのリスト。
パケットは、新しいIPv6ヘッダーのSRHに従って最初に転送されます。
- **End:**<br>
この操作では、Segment Leftを0(最後のホップではない)
にする必要があります。これにより、Segment Leftが1減少し、
IPv6パケットの宛先アドレスが最も一般的なSRv6操作である次の
Segmentに更新されます。SR MPLSのプレフィックスSIDと同等です。
- **End.X:**<br>
この操作は基本的にEnd操作と同じですが、
処理したパケットを指定したネクストホップアドレスに
送信できる点が異なります。
SR MPLSのAdj-SIDと同じです。
- **End.DX4:**<br>
この操作ではSegment Leftが0であり、
パケットがIPv4パケットをカプセル化しているため、
外側のIPv6ヘッダーは削除され、内部のIPv4パケットは
指定されたネクストホップアドレスに転送されます。
VPNv4のCEごとのラベルに相当します。
- **End.DX6:**<br>
この操作では、Segment Leftを0にしてIPv6パケットを
パケットにカプセル化し、外側のIPv6ヘッダーを削除して、
内部IPv6パケットを指定されたネクストホップアドレスに転送します。
VPNv6 Per-CEラベルと同等です。
- **End.B6:**<br>
既存のSRHに基づいて新しいSRHを挿入し、
新しいSegment listを定義すると、挿入された新しいSRHに
従ってデータパケットが最初に転送されます。Binding-SIDと同等です。
- **End.B6.Encaps:**<br>
この操作は基本的にEnd.B6と同じですが、違いは、
この操作では単にSRHルーティングヘッダーを追加するのではなく、
新しいIPv6ヘッダーとSRHをパケットの外側のレイヤーに追加することです。

## 参照

**Funcの概要に関してはこれらの画像がわかりやすい.(thx kamataさん)**<br>

| Function | Location | Description | Works-for |
| :------- | :------- | :---------- | :-------- |
| End | Core | DestとSRHを書き換えて, Next-hopをRIBから探して送る | Prefix-SID |
| End.X | Core | DestとSRHを書き換えて, 決められたNextHopへ送る | Adjacency-SID |
| End.T | Core | DestとSRHを書き換えて, NextHopを指定したRIBから探して送る | Multi-table Operation |
| End.DX2 | Edge | SRHを外して, 決められた送信IFへ送る (NH=59) | L2VPN |
| End.DX6 | Edge | SRHを外して, 決められたIPv6 NextHopへ送る (NH=41) | VPNv6 Per-CE Label |
| End.DX4 | Edge | SRHを外して, 決められたIPv4 NextHopへ送る (NH=4) | VPNv4 Per-CE Label |
| End.DT6 | Edge | SRHを外して, IPv6 NextHopを指定したRIBから探して送る (NH=41) | VPNv6 Per-VRF Label |
| End.DT4 | Edge | SRHを外して, IPv4 NextHopを指定したRIBから探して送る (NH=4) | VPNv4 Per-VRF Label |
| End.B6 | Edge | SRHは触らず, 新しいSID List(SRH)を挿入して, その先頭に送る | Binding SID |
| End.B6.Encaps | Edge | SRHを書き換えて, 新しいSID List(OuterHdr)でEncapして, その先頭に送る | Binding SID (Encap) |
| End.BM | Edge | DestとSRHを書き換えて, Labelを付与して, その先頭に送る | SRv6/SR-MPLS Binding |
| End.S | Core | 一番最後(or複数)のSIDでTable検索し, NextHopを探して送る | ICN |
| End.AS | Core | OuterHdrを外して, 決められた送信IFへ送る. <br>決められた受信IFに入ってきたPktにOuterHdrを付与し, その先頭へ送る| Service-Chaining (Proxy) |
| End.AM | Core | DestとSRHを書き換えて, 決められた送信IFへ送る. <br>決められた受信IFに入ってきたPktにSRHを付与し, その先頭に送る. | Service-Chaining (Masq) |
| T | Core | 通常のIPv6 Routing | - |
| T.Insert | Core | 新しいSRHを挿入して, その先頭に送る | - |
| T.Encaps | Core | 新しいIPv6 Hdr(SRHつき)を挿入して, その先頭に送る(L3)􏲟| - |
| T.Encaps.L2 | Core | 新しいIPv6 Hdr(SRHつき)を挿入して, その先頭に送る(L2)􏲟| - |

**iproute2 CLIに関してはこれらがわかりやすい.(thx ebikenさん)**<br>
```
# ip -6 route add <segment> encap seg6local action <action> <params> (dev <device> | via <nexthop>) [table localsid]
# ip -6 route add fc00::1/128 encap seg6local \
action End via 2001:db8::1
action End.X nh6 fc00::1:1 via 2001:db8::1
action End.T table 100 via 2001:db8::1
action End.DX2 oif lxcbr0 via 2001:db8::1
action End.DX4 nh4 10.0.3.254 via 2001:db8::1
action End.DX6 nh6 fc00::1:1 via 2001:db8::1
action End.DT6 table 100 via 2001:db8::1
action End.B6 srh segs beaf::1,beaf::2 via 2001:db8::1
action End.B6.Encaps srh segs beaf::1,beaf::2 via 2001:db8::1
# ip -6 route add <prefix> encap seg6 mode <encapmode> segs <segments> [hmac <keyid>] (dev <device> | via <nexthop>)
# ip -6 route add fc00:b::10/128 encap seg6 mode inline segs fc00:3::11,fc00:3::12,fc00:3::13 via fc00:a::a
# ip -6 route add fc00:b::10/128 encap seg6 mode encap segs fc00:3::11,fc00:3::12,fc00:3::13 via fc00:a::a
# ip sr tunsrc set <addr>
# ip sr hmac set <keyid> <algorithm>
```

- https://www.sdnlab.com/22842.html
- https://www.janog.gr.jp/meeting/janog40/application/files/2415/0051/7614/janog40-sr-kamata-takeda-00.pdf
- https://www.slideshare.net/kentaroebisawa/zebra-srv6-cli-on-linux-dataplane-enog49
- http://www.segment-routing.net/open-software/linux/
- http://www.segment-routing.net/open-software/vpp/

16 changes: 16 additions & 0 deletions examples/basic_srv6/binding_sid/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

# VRF Redirect
- Hiroki Shirokura <slankdev@coe.ad.jp>
- 2018.12.31

![](topo.jpeg)

```
$ cd <path/to/here>
$ tn up | sudo sh
$ tn conf | sudo sh
$ tn test p2p | sudo sh
$ tn test blue | sudo sh
$ tn test green | sudo sh
```

Loading

0 comments on commit a2accbd

Please sign in to comment.