func add()

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, &current.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, &current.Interface{
			Name:    tapLink.Attrs().Name,
			Sandbox: args.ContainerID,
			Mac:     tapMac.String(),
		})
		vmIfaceIndex := len(currentResult.Interfaces) - 1

		currentResult.IPs = append(currentResult.IPs, &current.IPConfig{
			Version:   "4",
			Address:   vethIPConf.Address,
			Gateway:   vethIPConf.Gateway,
			Interface: &vmIfaceIndex,
		})

		return types.PrintResult(currentResult, currentResult.CNIVersion)
	})
}