in internal/cmd/test-bridged-tap/main.go [47:164]
func add(args *skel.CmdArgs) error {
const mtu = 1500
vethName := args.IfName
return ns.WithNetNSPath(args.Netns, func(_ ns.NetNS) error {
currentResult, err := getCurrentResult(args)
if err != nil {
return err
}
vethLink, err := netlink.LinkByName(vethName)
if err != nil {
return err
}
var vethIPConf *current.IPConfig
for _, ipConfig := range currentResult.IPs {
if ifaceIndex := ipConfig.Interface; ifaceIndex != nil && *ifaceIndex == 1 {
vethIPConf = ipConfig
break
}
}
if vethIPConf == nil {
return errors.Errorf("did not find veth ip: %+v", currentResult)
}
err = netlink.AddrDel(vethLink, &netlink.Addr{
IPNet: &vethIPConf.Address,
})
if err != nil {
return err
}
tapName := "tap0"
err = netlink.LinkAdd(&netlink.Tuntap{
Mode: netlink.TUNTAP_MODE_TAP,
Queues: 1,
Flags: netlink.TUNTAP_ONE_QUEUE | netlink.TUNTAP_VNET_HDR,
LinkAttrs: netlink.LinkAttrs{
Name: tapName,
},
})
if err != nil {
return err
}
tapLink, err := netlink.LinkByName(tapName)
if err != nil {
return err
}
err = netlink.LinkSetMTU(tapLink, mtu)
if err != nil {
return err
}
err = netlink.LinkSetUp(tapLink)
if err != nil {
return err
}
bridgeName := "br0"
err = netlink.LinkAdd(&netlink.Bridge{
LinkAttrs: netlink.LinkAttrs{
Name: bridgeName,
MTU: mtu,
HardwareAddr: vethLink.Attrs().HardwareAddr,
},
})
if err != nil {
return err
}
bridgeLink, err := netlink.LinkByName(bridgeName)
if err != nil {
return err
}
err = netlink.LinkSetMaster(vethLink, bridgeLink.(*netlink.Bridge))
if err != nil {
return err
}
err = netlink.LinkSetMaster(tapLink, bridgeLink.(*netlink.Bridge))
if err != nil {
return err
}
err = netlink.LinkSetUp(bridgeLink)
if err != nil {
return err
}
currentResult.Interfaces = append(currentResult.Interfaces, ¤t.Interface{
Name: tapLink.Attrs().Name,
Sandbox: args.Netns,
Mac: tapLink.Attrs().HardwareAddr.String(),
})
tapMac := tapLink.Attrs().HardwareAddr
tapMac[1], tapMac[2] = tapMac[2], tapMac[1] // just need a different addr from the tap
currentResult.Interfaces = append(currentResult.Interfaces, ¤t.Interface{
Name: tapLink.Attrs().Name,
Sandbox: args.ContainerID,
Mac: tapMac.String(),
})
vmIfaceIndex := len(currentResult.Interfaces) - 1
currentResult.IPs = append(currentResult.IPs, ¤t.IPConfig{
Version: "4",
Address: vethIPConf.Address,
Gateway: vethIPConf.Gateway,
Interface: &vmIfaceIndex,
})
return types.PrintResult(currentResult, currentResult.CNIVersion)
})
}