/* Opens a socket for a local datapath, initializing 'dp'. If * 'subscribe_dp_idx' is nonnegative, listens for asynchronous messages * (packet-in, etc.) from the datapath with that number; otherwise, 'dp' will * receive only replies to explicitly initiated requests. */ int dpif_open(int subscribe_dp_idx, struct dpif *dp) { struct nl_sock *sock; int multicast_group = 0; int retval; retval = nl_lookup_genl_family(DP_GENL_FAMILY_NAME, &openflow_family); if (retval) { return retval; } if (subscribe_dp_idx >= 0) { retval = lookup_openflow_multicast_group(subscribe_dp_idx, &multicast_group); if (retval) { return retval; } } /* Specify a large so_rcvbuf size because we occasionally need to be able * to retrieve large collections of flow records. */ retval = nl_sock_create(NETLINK_GENERIC, multicast_group, 0, 4 * 1024u * 1024, &sock); if (retval) { return retval; } dp->sock = sock; return 0; }
/* Opens a socket for brcompat notifications. Returns 0 if successful, * otherwise a positive errno value. */ static int brc_open(struct nl_sock **sock) { int multicast_group = 0; int retval; retval = nl_lookup_genl_family(BRC_GENL_FAMILY_NAME, &brc_family); if (retval) { return retval; } retval = lookup_brc_multicast_group(&multicast_group); if (retval) { return retval; } retval = nl_sock_create(NETLINK_GENERIC, sock); if (retval) { return retval; } retval = nl_sock_join_mcgroup(*sock, multicast_group); if (retval) { nl_sock_destroy(*sock); *sock = NULL; } return retval; }
static int netdev_windows_init_(void) { int error = 0; static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; if (ovsthread_once_start(&once)) { error = nl_lookup_genl_family(OVS_WIN_NETDEV_FAMILY, &ovs_win_netdev_family); if (error) { VLOG_ERR("Generic Netlink family '%s' does not exist. " "The Open vSwitch kernel module is probably not loaded.", OVS_WIN_NETDEV_FAMILY); } if (!error) { /* XXX: Where to close this socket? */ error = nl_sock_create(NETLINK_GENERIC, &ovs_win_netdev_sock); } ovsthread_once_done(&once); } return error; }