func loadOpenvswitchModule() {
	if triedLoadOpenvswitchModule {
		return
	}
	s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
	if err != nil {
		triedLoadOpenvswitchModule = true
		return
	}
	defer syscall.Close(s)
	var req ifreqIfindex
	copy(req.name[:], []byte("openvswitch"))
	syscall.Syscall(syscall.SYS_IOCTL, uintptr(s),
		syscall.SIOCGIFINDEX, uintptr(unsafe.Pointer(&req)))
	triedLoadOpenvswitchModule = true
}
This tries to provoke the kernel into loading the openvswitch
module.  Yes, netdev ioctls can be used to load arbitrary modules,
if you have CAP_SYS_MODULE.
package odp
import (
	"fmt"
	"syscall"
	"unsafe"
)
const (
	DATAPATH     = iota
	VPORT        = iota
	FLOW         = iota
	PACKET       = iota
	FAMILY_COUNT = iota
)
var familyNames = [FAMILY_COUNT]string{
	"ovs_datapath",
	"ovs_vport",
	"ovs_flow",
	"ovs_packet",
}
type Dpif struct {
	sock     *NetlinkSocket
	families [FAMILY_COUNT]GenlFamily
}
type familyUnavailableError struct {
	family string
}
func (fue familyUnavailableError) Error() string {
	return fmt.Sprintf("Generic netlink family '%s' unavailable; the Open vSwitch kernel module is probably not loaded, try 'modprobe openvswitch'", fue.family)
}
func IsKernelLacksODPError(err error) bool {
	_, ok := err.(familyUnavailableError)
	return ok
}
func lookupFamily(sock *NetlinkSocket, name string) (GenlFamily, error) {
	family, err := sock.LookupGenlFamily(name)
	if err == nil {
		return family, nil
	}
	if err == NetlinkError(syscall.ENOENT) {
		loadOpenvswitchModule()
		family, err = sock.LookupGenlFamily(name)
		if err == nil {
			return family, nil
		}
		if err == NetlinkError(syscall.ENOENT) {
			err = familyUnavailableError{name}
		}
	}
	return GenlFamily{}, err
}
var triedLoadOpenvswitchModule bool