/* An AF_INET socket (used for ioctl operations). */
static int af_inet_sock = -1;
+/* A Netlink routing socket that is not subscribed to any multicast groups. */
+static struct nl_sock *rtnl_sock;
+
struct netdev_linux_notifier {
struct netdev_notifier notifier;
struct list node;
const uint8_t[ETH_ADDR_LEN]);
static int get_stats_via_netlink(int ifindex, struct netdev_stats *stats);
static int get_stats_via_proc(const char *netdev_name, struct netdev_stats *stats);
-static int get_rtnl_sock(struct nl_sock **);
static bool
is_netdev_linux_class(const struct netdev_class *netdev_class)
return CONTAINER_OF(netdev, struct netdev_linux, netdev);
}
-
+\f
static int
netdev_linux_init(void)
{
static int status = -1;
if (status < 0) {
+ /* Create AF_INET socket. */
af_inet_sock = socket(AF_INET, SOCK_DGRAM, 0);
status = af_inet_sock >= 0 ? 0 : errno;
if (status) {
VLOG_ERR("failed to create inet socket: %s", strerror(status));
}
+
+ /* Create rtnetlink socket. */
+ if (!status) {
+ status = nl_sock_create(NETLINK_ROUTE, 0, 0, 0, &rtnl_sock);
+ if (status) {
+ VLOG_ERR_RL(&rl, "failed to create rtnetlink socket: %s",
+ strerror(status));
+ }
+ }
}
return status;
}
struct ofpbuf request;
struct ofpbuf *reply;
struct tcmsg *tcmsg;
- struct nl_sock *rtnl_sock;
int ifindex;
int error;
return error;
}
- error = get_rtnl_sock(&rtnl_sock);
- if (error) {
- return error;
- }
-
ofpbuf_init(&request, 0);
nl_msg_put_nlmsghdr(&request, sizeof *tcmsg, RTM_DELQDISC, NLM_F_REQUEST);
tcmsg = ofpbuf_put_zeros(&request, sizeof *tcmsg);
.min_len = sizeof(struct rtnl_link_stats) },
};
- struct nl_sock *rtnl_sock;
struct ofpbuf request;
struct ofpbuf *reply;
struct ifinfomsg *ifi;
struct nlattr *attrs[ARRAY_SIZE(rtnlgrp_link_policy)];
int error;
- error = get_rtnl_sock(&rtnl_sock);
- if (error) {
- return error;
- }
-
ofpbuf_init(&request, 0);
nl_msg_put_nlmsghdr(&request, sizeof *ifi, RTM_GETLINK, NLM_F_REQUEST);
ifi = ofpbuf_put_zeros(&request, sizeof *ifi);
}
return error;
}
-
-/* Obtains a Netlink routing socket that is not subscribed to any multicast
- * groups. Returns 0 if successful, otherwise a positive errno value. Stores
- * the socket in '*rtnl_sockp' if successful, otherwise a null pointer. */
-static int
-get_rtnl_sock(struct nl_sock **rtnl_sockp)
-{
- static struct nl_sock *sock;
- int error;
-
- if (!sock) {
- error = nl_sock_create(NETLINK_ROUTE, 0, 0, 0, &sock);
- if (error) {
- VLOG_ERR_RL(&rl, "failed to create rtnetlink socket: %s",
- strerror(error));
- }
- } else {
- error = 0;
- }
-
- *rtnl_sockp = sock;
- return error;
-}