Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix macaddr bug #102

Merged
merged 2 commits into from
Dec 7, 2022
Merged

Fix macaddr bug #102

merged 2 commits into from
Dec 7, 2022

Conversation

Sabaniki
Copy link
Contributor

@Sabaniki Sabaniki commented Dec 5, 2022

このパッチは nodes > interface > addr フィールドを利用してインターフェイスの MAC アドレスを指定する機能のバグの修正です.

このバグは,yaml ファイルで指定された MAC アドレスを割り振る処理を N2nLink 関数 の中で行っていたために発生していました.

nodes:
- name: Router
  image: sabaniki/frr:latest
  interfaces:
  - { name: vm1, type: direct, args: VM1#rt, addr: 10:00:00:00:00:10 }
  - { name: vm2, type: direct, args: VM2#rt, addr: 20:00:00:00:00:20 }
  - { name: vm3, type: direct, args: VM3#rt, addr: 30:00:00:00:00:30 }

- name: VM1
  image: sabaniki/frr:latest
  interfaces:
  - { name: rt, type: direct, args: Router#vm1, addr: 10:10:10:10:10:10 }

- name: VM2
  image: sabaniki/frr:latest
  interfaces:
  - { name: rt, type: direct, args: Router#vm2, addr: 20:20:20:20:20:20 }

- name: VM3
  image: sabaniki/frr:latest
  interfaces:
  - { name: rt, type: direct, args: Router#vm3, addr: 30:30:30:30:30:30 }

上記の spec.yaml に対して tinet up を実行すると,出力は以下の通りとなり,VM 側のインターフェイスの MAC アドレスが指定されていません.

docker run -td --net none --name Router --rm --privileged --hostname Router -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect Router --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/Router > /dev/null
docker run -td --net none --name VM1 --rm --privileged --hostname VM1 -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect VM1 --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/VM1 > /dev/null
docker run -td --net none --name VM2 --rm --privileged --hostname VM2 -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect VM2 --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/VM2 > /dev/null
docker run -td --net none --name VM3 --rm --privileged --hostname VM3 -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect VM3 --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/VM3 > /dev/null
ip link add vm1 netns Router type veth peer name rt netns VM1 > /dev/null
ip netns exec Router ip link set vm1 up > /dev/null
ip netns exec VM1 ip link set rt up > /dev/null
ip netns exec Router ip link set vm1 address 10:00:00:00:00:10 > /dev/null
ip link add vm2 netns Router type veth peer name rt netns VM2 > /dev/null
ip netns exec Router ip link set vm2 up > /dev/null
ip netns exec VM2 ip link set rt up > /dev/null
ip netns exec Router ip link set vm2 address 20:00:00:00:00:20 > /dev/null
ip link add vm3 netns Router type veth peer name rt netns VM3 > /dev/null
ip netns exec Router ip link set vm3 up > /dev/null
ip netns exec VM3 ip link set rt up > /dev/null
ip netns exec Router ip link set vm3 address 30:00:00:00:00:30 > /dev/null
ip netns del Router > /dev/null
ip netns del VM1 > /dev/null
ip netns del VM2 > /dev/null
ip netns del VM3 > /dev/null

N2n関数は CmdUp 関数 の中でノードを接続するために実行されます.Router#vm1 と VM1#rt をつなげる際,Router#vm1 に対してのみ実行され,VM1#rt に対してはスキップされます.そのため,VM1#rt に対して MAC アドレスを指定する処理が行われません.

バグ修正後の実行結果は以下のとおりです.

docker run -td --net none --name Router --rm --privileged --hostname Router -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect Router --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/Router > /dev/null
docker run -td --net none --name VM1 --rm --privileged --hostname VM1 -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect VM1 --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/VM1 > /dev/null
docker run -td --net none --name VM2 --rm --privileged --hostname VM2 -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect VM2 --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/VM2 > /dev/null
docker run -td --net none --name VM3 --rm --privileged --hostname VM3 -v /tmp/tinet:/tinet sabaniki/frr:latest > /dev/null
mkdir -p /var/run/netns > /dev/null
PID=`docker inspect VM3 --format '{{.State.Pid}}'` > /dev/null
ln -s /proc/$PID/ns/net /var/run/netns/VM3 > /dev/null
ip link add vm1 netns Router type veth peer name rt netns VM1 > /dev/null
ip netns exec Router ip link set vm1 up > /dev/null
ip netns exec VM1 ip link set rt up > /dev/null
ip netns exec Router ip link set vm1 address 10:00:00:00:00:10 > /dev/null
ip link add vm2 netns Router type veth peer name rt netns VM2 > /dev/null
ip netns exec Router ip link set vm2 up > /dev/null
ip netns exec VM2 ip link set rt up > /dev/null
ip netns exec Router ip link set vm2 address 20:00:00:00:00:20 > /dev/null
ip link add vm3 netns Router type veth peer name rt netns VM3 > /dev/null
ip netns exec Router ip link set vm3 up > /dev/null
ip netns exec VM3 ip link set rt up > /dev/null
ip netns exec Router ip link set vm3 address 30:00:00:00:00:30 > /dev/null
+ ip netns exec VM1 ip link set rt address 10:10:10:10:10:10 > /dev/null
+ ip netns exec VM2 ip link set rt address 20:20:20:20:20:20 > /dev/null
+ ip netns exec VM3 ip link set rt address 30:30:30:30:30:30 > /dev/null
ip netns del Router > /dev/null
ip netns del VM1 > /dev/null
ip netns del VM2 > /dev/null
ip netns del VM3 > /dev/null

また,プログラム上は MAC アドレスの指定はaddr: XX:XX:XX:XX:XX:XXで行われることを想定していますが,ドキュメント上はmac: XX:XX:XX:XX:XX:XXとなっていたため,これについても修正しました.

@slankdev
Copy link
Contributor

slankdev commented Dec 5, 2022

ありがとうございます!
方針として完全に理解していて, 良いと思うんですが, このshell scriptって成功しますかね.
というのも, ip link set NAME address ADDR って, link downしていないと確か成功しなかった記憶があります.

それ以外はLGTMです

@Sabaniki
Copy link
Contributor Author

Sabaniki commented Dec 5, 2022

ありがとうございます! 方針として完全に理解していて, 良いと思うんですが, このshell scriptって成功しますかね. というのも, ip link set NAME address ADDR って, link downしていないと確か成功しなかった記憶があります.

それ以外はLGTMです

以下が実際の実行結果です.

+ docker run -td --net none --name Router --rm --privileged --hostname Router -v /tmp/tinet:/tinet sabaniki/frr:latest
+ mkdir -p /var/run/netns
+ docker inspect Router --format {{.State.Pid}}
+ PID=605795
+ ln -s /proc/605795/ns/net /var/run/netns/Router
+ docker run -td --net none --name VM1 --rm --privileged --hostname VM1 -v /tmp/tinet:/tinet sabaniki/frr:latest
+ mkdir -p /var/run/netns
+ docker inspect VM1 --format {{.State.Pid}}
+ PID=605997
+ ln -s /proc/605997/ns/net /var/run/netns/VM1
+ docker run -td --net none --name VM2 --rm --privileged --hostname VM2 -v /tmp/tinet:/tinet sabaniki/frr:latest
+ mkdir -p /var/run/netns
+ docker inspect VM2 --format {{.State.Pid}}
+ PID=606239
+ ln -s /proc/606239/ns/net /var/run/netns/VM2
+ docker run -td --net none --name VM3 --rm --privileged --hostname VM3 -v /tmp/tinet:/tinet sabaniki/frr:latest
+ mkdir -p /var/run/netns
+ docker inspect VM3 --format {{.State.Pid}}
+ PID=606475
+ ln -s /proc/606475/ns/net /var/run/netns/VM3
+ ip link add vm1 netns Router type veth peer name rt netns VM1
+ ip netns exec Router ip link set vm1 up
+ ip netns exec VM1 ip link set rt up
+ ip netns exec Router ip link set vm1 address 10:00:00:00:00:10
+ ip link add vm2 netns Router type veth peer name rt netns VM2
+ ip netns exec Router ip link set vm2 up
+ ip netns exec VM2 ip link set rt up
+ ip netns exec Router ip link set vm2 address 20:00:00:00:00:20
+ ip link add vm3 netns Router type veth peer name rt netns VM3
+ ip netns exec Router ip link set vm3 up
+ ip netns exec VM3 ip link set rt up
+ ip netns exec Router ip link set vm3 address 30:00:00:00:00:30
+ ip netns exec VM1 ip link set rt address 10:10:10:10:10:10
+ ip netns exec VM2 ip link set rt address 20:20:20:20:20:20
+ ip netns exec VM3 ip link set rt address 30:30:30:30:30:30
+ ip netns del Router
+ ip netns del VM1
+ ip netns del VM2
+ ip netns del VM3

  ~/test ································································································ sabaniki@dev-local
❯ docker exec -it Router ip -br l
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
pimreg@NONE      UNKNOWN        <NOARP,UP,LOWER_UP>
vm1@if3          UP             10:00:00:00:00:10 <BROADCAST,MULTICAST,UP,LOWER_UP>
vm2@if3          UP             20:00:00:00:00:20 <BROADCAST,MULTICAST,UP,LOWER_UP>
vm3@if2          UP             30:00:00:00:00:30 <BROADCAST,MULTICAST,UP,LOWER_UP>

  ~/test ································································································ sabaniki@dev-local
❯ docker exec -it VM1 ip -br l
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
pimreg@NONE      UNKNOWN        <NOARP,UP,LOWER_UP>
rt@if3           UP             10:10:10:10:10:10 <BROADCAST,MULTICAST,UP,LOWER_UP>

  ~/test ································································································ sabaniki@dev-local
❯ docker exec -it VM2 ip -br l
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
pimreg@NONE      UNKNOWN        <NOARP,UP,LOWER_UP>
rt@if4           UP             20:20:20:20:20:20 <BROADCAST,MULTICAST,UP,LOWER_UP>

  ~/test ································································································ sabaniki@dev-local
❯ docker exec -it VM3 ip -br l
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
rt@if5           UP             30:30:30:30:30:30 <BROADCAST,MULTICAST,UP,LOWER_UP>
pimreg@NONE      UNKNOWN        <NOARP,UP,LOWER_UP>

正常に MAC アドレスが変更されていることがわかります.
また,以下のコマンドの実行結果から,link を down せずとも MAC アドレスを変更できることを確認しました

❯ docker exec -it VM1 ip -br l
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
pimreg@NONE      UNKNOWN        <NOARP,UP,LOWER_UP>
rt@if3           UP             10:10:10:10:10:10 <BROADCAST,MULTICAST,UP,LOWER_UP>

  ~/test ································································································ sabaniki@dev-local
❯ docker exec -it VM1 ip link set addr 10:10:10:10:10:21 dev rt


  ~/test ································································································ sabaniki@dev-local
❯ docker exec -it VM1 ip -br l
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
pimreg@NONE      UNKNOWN        <NOARP,UP,LOWER_UP>
rt@if3           UP             10:10:10:10:10:21 <BROADCAST,MULTICAST,UP,LOWER_UP>

また,以下のように Network Namespace 内で IP コマンドを実行しても同様に変更されることを確認しました.

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip netns add test1

  ~/test ··························································································· sabaniki@dev-local
❯ sudo ip netns add test2

  ~/test ·························································································· ✘ 255 sabaniki@dev-local
❯ sudo ip link add eth0-t1 type veth peer name eth0-t2

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip link set eth0-t1 netns test1

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip link set eth0-t2 netns test2

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip netns exec test1 ip link set up dev eth0-t1

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip netns exec test2 ip link set up dev eth0-t2

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip netns exec test1 ip -br l
lo               DOWN           00:00:00:00:00:00 <LOOPBACK>
eth0-t1@if33     UP             72:9f:e4:ea:02:ed <BROADCAST,MULTICAST,UP,LOWER_UP>

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip netns exec test2 ip -br l
lo               DOWN           00:00:00:00:00:00 <LOOPBACK>
eth0-t2@if34     UP             1a:47:d2:d2:c5:1e <BROADCAST,MULTICAST,UP,LOWER_UP>

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip netns exec test1 ip link set addr 10:00:00:00:00:10 dev eth0-t1

  ~/test ································································································ sabaniki@dev-local
❯ sudo ip netns exec test1 ip -br l
lo               DOWN           00:00:00:00:00:00 <LOOPBACK>
eth0-t1@if33     UP             10:00:00:00:00:10 <BROADCAST,MULTICAST,UP,LOWER_UP>

これはあくまでも私の予想ですが,veth に関しては MAC アドレスを変更する際,リンクダウンさせることは必須ではないのではないか,と考えています.

追加の調査などが必要であれば行います.

Copy link
Contributor

@slankdev slankdev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@slankdev slankdev merged commit 6d9b552 into tinynetwork:master Dec 7, 2022
kimitoboku added a commit to kimitoboku/tinet-go that referenced this pull request Sep 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants