mirror of
https://github.com/openvswitch/ovs
synced 2025-08-29 13:27:59 +00:00
netdev-linux: Create rtnetlink socket up front instead of on demand.
This simplifies a bit of existing code since it is known that an rtnetlink socket will always be available. It will simplify additional code in upcoming commits.
This commit is contained in:
parent
38a997566d
commit
ff4ed3c9a1
@ -125,6 +125,9 @@ struct netdev_linux {
|
|||||||
/* An AF_INET socket (used for ioctl operations). */
|
/* An AF_INET socket (used for ioctl operations). */
|
||||||
static int af_inet_sock = -1;
|
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_linux_notifier {
|
||||||
struct netdev_notifier notifier;
|
struct netdev_notifier notifier;
|
||||||
struct list node;
|
struct list node;
|
||||||
@ -158,7 +161,6 @@ static int set_etheraddr(const char *netdev_name, int hwaddr_family,
|
|||||||
const uint8_t[ETH_ADDR_LEN]);
|
const uint8_t[ETH_ADDR_LEN]);
|
||||||
static int get_stats_via_netlink(int ifindex, struct netdev_stats *stats);
|
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_stats_via_proc(const char *netdev_name, struct netdev_stats *stats);
|
||||||
static int get_rtnl_sock(struct nl_sock **);
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
is_netdev_linux_class(const struct netdev_class *netdev_class)
|
is_netdev_linux_class(const struct netdev_class *netdev_class)
|
||||||
@ -184,17 +186,27 @@ netdev_linux_cast(const struct netdev *netdev)
|
|||||||
|
|
||||||
return CONTAINER_OF(netdev, struct netdev_linux, netdev);
|
return CONTAINER_OF(netdev, struct netdev_linux, netdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
netdev_linux_init(void)
|
netdev_linux_init(void)
|
||||||
{
|
{
|
||||||
static int status = -1;
|
static int status = -1;
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
|
/* Create AF_INET socket. */
|
||||||
af_inet_sock = socket(AF_INET, SOCK_DGRAM, 0);
|
af_inet_sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
status = af_inet_sock >= 0 ? 0 : errno;
|
status = af_inet_sock >= 0 ? 0 : errno;
|
||||||
if (status) {
|
if (status) {
|
||||||
VLOG_ERR("failed to create inet socket: %s", strerror(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;
|
return status;
|
||||||
}
|
}
|
||||||
@ -1117,7 +1129,6 @@ netdev_linux_remove_policing(struct netdev *netdev)
|
|||||||
struct ofpbuf request;
|
struct ofpbuf request;
|
||||||
struct ofpbuf *reply;
|
struct ofpbuf *reply;
|
||||||
struct tcmsg *tcmsg;
|
struct tcmsg *tcmsg;
|
||||||
struct nl_sock *rtnl_sock;
|
|
||||||
int ifindex;
|
int ifindex;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
@ -1126,11 +1137,6 @@ netdev_linux_remove_policing(struct netdev *netdev)
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = get_rtnl_sock(&rtnl_sock);
|
|
||||||
if (error) {
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ofpbuf_init(&request, 0);
|
ofpbuf_init(&request, 0);
|
||||||
nl_msg_put_nlmsghdr(&request, sizeof *tcmsg, RTM_DELQDISC, NLM_F_REQUEST);
|
nl_msg_put_nlmsghdr(&request, sizeof *tcmsg, RTM_DELQDISC, NLM_F_REQUEST);
|
||||||
tcmsg = ofpbuf_put_zeros(&request, sizeof *tcmsg);
|
tcmsg = ofpbuf_put_zeros(&request, sizeof *tcmsg);
|
||||||
@ -1679,7 +1685,6 @@ get_stats_via_netlink(int ifindex, struct netdev_stats *stats)
|
|||||||
.min_len = sizeof(struct rtnl_link_stats) },
|
.min_len = sizeof(struct rtnl_link_stats) },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nl_sock *rtnl_sock;
|
|
||||||
struct ofpbuf request;
|
struct ofpbuf request;
|
||||||
struct ofpbuf *reply;
|
struct ofpbuf *reply;
|
||||||
struct ifinfomsg *ifi;
|
struct ifinfomsg *ifi;
|
||||||
@ -1687,11 +1692,6 @@ get_stats_via_netlink(int ifindex, struct netdev_stats *stats)
|
|||||||
struct nlattr *attrs[ARRAY_SIZE(rtnlgrp_link_policy)];
|
struct nlattr *attrs[ARRAY_SIZE(rtnlgrp_link_policy)];
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = get_rtnl_sock(&rtnl_sock);
|
|
||||||
if (error) {
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ofpbuf_init(&request, 0);
|
ofpbuf_init(&request, 0);
|
||||||
nl_msg_put_nlmsghdr(&request, sizeof *ifi, RTM_GETLINK, NLM_F_REQUEST);
|
nl_msg_put_nlmsghdr(&request, sizeof *ifi, RTM_GETLINK, NLM_F_REQUEST);
|
||||||
ifi = ofpbuf_put_zeros(&request, sizeof *ifi);
|
ifi = ofpbuf_put_zeros(&request, sizeof *ifi);
|
||||||
@ -1952,26 +1952,3 @@ netdev_linux_get_ipv4(const struct netdev *netdev, struct in_addr *ip,
|
|||||||
}
|
}
|
||||||
return error;
|
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;
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user