netlink/netlink_linux.go
func NetworkCreateVethPair(name1, name2 string, txQueueLen int) error {
	s, err := getNetlinkSocket()
	if err != nil {
		return err
	}
	defer s.Close()

	wb := newNetlinkRequest(syscall.RTM_NEWLINK, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK)

	msg := newIfInfomsg(syscall.AF_UNSPEC)
	wb.AddData(msg)

	nameData := newRtAttr(syscall.IFLA_IFNAME, zeroTerminated(name1))
	wb.AddData(nameData)

	txqLen := make([]byte, 4)
	native.PutUint32(txqLen, uint32(txQueueLen))
	txqData := newRtAttr(syscall.IFLA_TXQLEN, txqLen)
	wb.AddData(txqData)

	nest1 := newRtAttr(syscall.IFLA_LINKINFO, nil)
	newRtAttrChild(nest1, IFLA_INFO_KIND, zeroTerminated("veth"))
	nest2 := newRtAttrChild(nest1, IFLA_INFO_DATA, nil)
	nest3 := newRtAttrChild(nest2, VETH_INFO_PEER, nil)

	newIfInfomsgChild(nest3, syscall.AF_UNSPEC)
	newRtAttrChild(nest3, syscall.IFLA_IFNAME, zeroTerminated(name2))

	txqLen2 := make([]byte, 4)
	native.PutUint32(txqLen2, uint32(txQueueLen))
	newRtAttrChild(nest3, syscall.IFLA_TXQLEN, txqLen2)

	wb.AddData(nest1)

	if err := s.Send(wb); err != nil {
		return err
	}

	if err := s.HandleAck(wb.Seq); err != nil {
		if os.IsExist(err) {
			return ErrInterfaceExists
		}

		return err
	}

	return nil
}
func NetworkCreateVethPair(name1, name2 string, txQueueLen int) error {
	s, err := getNetlinkSocket()
	if err != nil {
		return err
	}
	defer s.Close()

	wb := newNetlinkRequest(syscall.RTM_NEWLINK, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK)

	msg := newIfInfomsg(syscall.AF_UNSPEC)
	wb.AddData(msg)

	nameData := newRtAttr(syscall.IFLA_IFNAME, zeroTerminated(name1))
	wb.AddData(nameData)

	txqLen := make([]byte, 4)
	native.PutUint32(txqLen, uint32(txQueueLen))
	txqData := newRtAttr(syscall.IFLA_TXQLEN, txqLen)
	wb.AddData(txqData)

	nest1 := newRtAttr(syscall.IFLA_LINKINFO, nil)
	newRtAttrChild(nest1, IFLA_INFO_KIND, zeroTerminated("veth"))
	nest2 := newRtAttrChild(nest1, IFLA_INFO_DATA, nil)
	nest3 := newRtAttrChild(nest2, VETH_INFO_PEER, nil)

	newIfInfomsgChild(nest3, syscall.AF_UNSPEC)
	newRtAttrChild(nest3, syscall.IFLA_IFNAME, zeroTerminated(name2))

	txqLen2 := make([]byte, 4)
	native.PutUint32(txqLen2, uint32(txQueueLen))
	newRtAttrChild(nest3, syscall.IFLA_TXQLEN, txqLen2)

	wb.AddData(nest1)

	if err := s.Send(wb); err != nil {
		return err
	}

	if err := s.HandleAck(wb.Seq); err != nil {
		if os.IsExist(err) {
			return ErrInterfaceExists
		}

		return err
	}

	return nil
}
func NetworkCreateVethPair ( name1 , name2 string , txQueueLen int ) error { s , err := getNetlinkSocket ( ) if err != nil { return err } defer s . Close ( ) wb := newNetlinkRequest ( syscall . RTM_NEWLINK , syscall . NLM_F_CREATE | syscall . NLM_F_EXCL | syscall . NLM_F_ACK ) msg := newIfInfomsg ( syscall . AF_UNSPEC ) wb . AddData ( msg ) nameData := newRtAttr ( syscall . IFLA_IFNAME , zeroTerminated ( name1 ) ) wb . AddData ( nameData ) txqLen := make ( [ ] byte , 4 ) native . PutUint32 ( txqLen , uint32 ( txQueueLen ) ) txqData := newRtAttr ( syscall . IFLA_TXQLEN , txqLen ) wb . AddData ( txqData ) nest1 := newRtAttr ( syscall . IFLA_LINKINFO , nil ) newRtAttrChild ( nest1 , IFLA_INFO_KIND , zeroTerminated ( " " ) ) nest2 := newRtAttrChild ( nest1 , IFLA_INFO_DATA , nil ) nest3 := newRtAttrChild ( nest2 , VETH_INFO_PEER , nil ) newIfInfomsgChild ( nest3 , syscall . AF_UNSPEC ) newRtAttrChild ( nest3 , syscall . IFLA_IFNAME , zeroTerminated ( name2 ) ) txqLen2 := make ( [ ] byte , 4 ) native . PutUint32 ( txqLen2 , uint32 ( txQueueLen ) ) newRtAttrChild ( nest3 , syscall . IFLA_TXQLEN , txqLen2 ) wb . AddData ( nest1 ) if err := s . Send ( wb ) ; err != nil { return err } if err := s . HandleAck ( wb . Seq ) ; err != nil { if os . IsExist ( err ) { return ErrInterfaceExists } return err } return nil }
// Add a new VETH pair link on the host
// This is identical to running: ip link add name $name type veth peer name $peername
Add a new VETH pair link on the host This is identical to running : ip link add name $name type veth peer name $peername