}
\f
struct dpifmon {
- const struct dpif *dpif;
+ struct dpif dpif;
struct nl_sock *sock;
int local_ifindex;
};
int
-dpifmon_create(const struct dpif *dpif, struct dpifmon **monp)
+dpifmon_create(const char *datapath_name, struct dpifmon **monp)
{
- struct nl_sock *sock;
struct dpifmon *mon;
struct odp_port local;
- unsigned int local_ifindex;
int error;
- *monp = NULL;
+ mon = *monp = xmalloc(sizeof *mon);
- error = dpif_port_query_by_number(dpif, ODPP_LOCAL, &local);
+ error = dpif_open(datapath_name, &mon->dpif);
if (error) {
- return error;
+ goto error;
+ }
+ error = dpif_port_query_by_number(&mon->dpif, ODPP_LOCAL, &local);
+ if (error) {
+ goto error_close_dpif;
}
- local_ifindex = if_nametoindex(local.devname);
- if (!local_ifindex) {
+ mon->local_ifindex = if_nametoindex(local.devname);
+ if (!mon->local_ifindex) {
+ error = errno;
VLOG_WARN("could not get ifindex of %s device: %s",
local.devname, strerror(errno));
- return errno;
+ goto error_close_dpif;
}
- error = nl_sock_create(NETLINK_ROUTE, RTNLGRP_LINK, 0, 0, &sock);
+ error = nl_sock_create(NETLINK_ROUTE, RTNLGRP_LINK, 0, 0, &mon->sock);
if (error) {
VLOG_WARN("could not create rtnetlink socket: %s", strerror(error));
- return error;
+ goto error_close_dpif;
}
- mon = *monp = xmalloc(sizeof *mon);
- mon->dpif = dpif;
- mon->sock = sock;
- mon->local_ifindex = local_ifindex;
return 0;
+
+error_close_dpif:
+ dpif_close(&mon->dpif);
+error:
+ free(mon);
+ *monp = NULL;
+ return error;
}
void
dpifmon_destroy(struct dpifmon *mon)
{
if (mon) {
+ dpif_close(&mon->dpif);
nl_sock_destroy(mon->sock);
}
}
for_us = master_ifindex == mon->local_ifindex;
} else {
struct odp_port odp_port;
- for_us = (dpif_port_query_by_name(mon->dpif, devname,
+ for_us = (dpif_port_query_by_name(&mon->dpif, devname,
&odp_port) == 0);
}
dpif_flow_flush(&dpif);
/* Start monitoring datapath ports for status changes. */
- error = dpifmon_create(&dpif, &dpifmon);
+ error = dpifmon_create(datapath, &dpifmon);
if (error) {
VLOG_ERR("failed to starting monitoring datapath %s: %s",
datapath, strerror(error));