Helped-by: Luca <luca@daerich.com>
- "link" <node> <node> <net-name> ["l3"]
+ "link" <node> <node> <net-name>|"-" ["l3"]
"link" creates links between nodes. The IP addresses are taken from the given
"link" creates links between nodes. The IP addresses are taken from the given
-network name. /31 is used for IPv4- and /127 for IPv6-prefixes. The MAC
-address is not static and allocated by the kernel. The link is named after the
-node "on the other side". Multiple links can be created between two nodes. In
-this case "_2", "_3", etc. is appended to the interface name. By default veth
-interfaces are used, adding "l3" changes this to netkit which provide a
+network name. /31 is used for IPv4- and /127 for IPv6-prefixes. If "-" is used
+as net-name then no addresses are assigned (useful for unnumbered links). The
+MAC address is not static and allocated by the kernel. The link is named after
+the node "on the other side". Multiple links can be created between two nodes.
+In this case "_2", "_3", etc. is appended to the interface name. By default
+veth interfaces are used, adding "l3" changes this to netkit which provide a
layer-3 connection without needing ARP (requires kernel 6.7, iproute2 6.8).
=== Option "cmd"
layer-3 connection without needing ARP (requires kernel 6.7, iproute2 6.8).
=== Option "cmd"
usage = `"node" <name> [<loopback-net-name>...]`
err = parseConfigNode(&cfg, xs[1:])
case "link":
usage = `"node" <name> [<loopback-net-name>...]`
err = parseConfigNode(&cfg, xs[1:])
case "link":
- usage = `"link" <node> <node> <net-name> ["l3"]`
+ usage = `"link" <node> <node> <net-name>|"-" ["l3"]`
err = parseConfigLink(&cfg, xs[1:])
case "cmd":
usage = `"cmd" <string-passed-to-sh-c>`
err = parseConfigLink(&cfg, xs[1:])
case "cmd":
usage = `"cmd" <string-passed-to-sh-c>`
return fmt.Errorf("node %q does not exist", args[1])
}
return fmt.Errorf("node %q does not exist", args[1])
}
- n := cfg.Nets[args[2]]
- if n == nil {
- return fmt.Errorf("net %q does not exist", args[2])
- }
- a1, err := n.Next()
- if err != nil {
- return err
- }
- a2, err := n.Next()
- if err != nil {
- return err
+ var a1, a2 []netip.Addr
+ if args[2] != "-" {
+ n := cfg.Nets[args[2]]
+ if n == nil {
+ return fmt.Errorf("net %q does not exist", args[2])
+ }
+ var err error
+ a1, err = n.Next()
+ if err != nil {
+ return err
+ }
+ a2, err = n.Next()
+ if err != nil {
+ return err
+ }