VALID_CARRIER = 1 << 5
};
-/* An AF_INET socket (used for ioctl operations). */
-static int af_inet_sock = -1;
-
#if defined(__NetBSD__)
/* AF_LINK socket used for netdev_bsd_get_stats and set_etheraddr */
static int af_link_sock = -1;
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
-static int netdev_bsd_do_ioctl(const char *, struct ifreq *, unsigned long cmd,
- const char *cmd_name);
static void destroy_tap(int fd, const char *name);
static int get_flags(const struct netdev *, int *flagsp);
static int set_flags(const char *, int flags);
static int
netdev_bsd_init(void)
{
+#if defined(__NetBSD__)
static int status = -1;
if (status >= 0) { /* already initialized */
return status;
}
- 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", ovs_strerror(status));
- return status;
- }
-
-#if defined(__NetBSD__)
af_link_sock = socket(AF_LINK, SOCK_DGRAM, 0);
status = af_link_sock >= 0 ? 0 : errno;
if (status) {
VLOG_ERR("failed to create link socket: %s", ovs_strerror(status));
- close(af_inet_sock);
- af_inet_sock = -1;
}
-#endif /* defined(__NetBSD__) */
return status;
+#else
+ return 0;
+#endif /* defined(__NetBSD__) */
}
/*
/* Change the name of the tap device */
#if defined(SIOCSIFNAME)
ifr.ifr_data = (void *)name;
- if (ioctl(af_inet_sock, SIOCSIFNAME, &ifr) == -1) {
- error = errno;
+ error = af_inet_ioctl(SIOCSIFNAME, &ifr);
+ if (error) {
destroy_tap(netdev->tap_fd, ifr.ifr_name);
goto error_unref_notifier;
}
/* Turn device UP */
ifr_set_flags(&ifr, IFF_UP);
strncpy(ifr.ifr_name, kernel_name, sizeof ifr.ifr_name);
- if (ioctl(af_inet_sock, SIOCSIFFLAGS, &ifr) == -1) {
- error = errno;
+ error = af_inet_ioctl(SIOCSIFFLAGS, &ifr);
+ if (error) {
destroy_tap(netdev->tap_fd, kernel_name);
goto error_unref_notifier;
}
struct ifreq ifr;
int error;
- error = netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev_), &ifr,
+ error = af_inet_ifreq_ioctl(netdev_get_kernel_name(netdev_), &ifr,
SIOCGIFMTU, "SIOCGIFMTU");
if (error) {
return error;
if (!(netdev->cache_valid & VALID_CARRIER)) {
struct ifmediareq ifmr;
+ int error;
memset(&ifmr, 0, sizeof(ifmr));
strncpy(ifmr.ifm_name, netdev_get_kernel_name(netdev_),
sizeof ifmr.ifm_name);
- if (ioctl(af_inet_sock, SIOCGIFMEDIA, &ifmr) == -1) {
+ error = af_inet_ioctl(SIOCGIFMEDIA, &ifmr);
+ if (error) {
VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFMEDIA) failed: %s",
- netdev_get_name(netdev_), ovs_strerror(errno));
- return errno;
+ netdev_get_name(netdev_), ovs_strerror(error));
+ return error;
}
netdev->carrier = (ifmr.ifm_status & IFM_ACTIVE) == IFM_ACTIVE;
/* We make two SIOCGIFMEDIA ioctl calls. The first to determine the
* number of supported modes, and a second with a buffer to retrieve
* them. */
- if (ioctl(af_inet_sock, SIOCGIFMEDIA, &ifmr) == -1) {
+ error = af_inet_ioctl(SIOCGIFMEDIA, &ifmr);
+ if (error) {
VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFMEDIA) failed: %s",
- netdev_get_name(netdev), ovs_strerror(errno));
- return errno;
+ netdev_get_name(netdev), ovs_strerror(error));
+ return error;
}
media_list = xcalloc(ifmr.ifm_count, sizeof(int));
goto cleanup;
}
- if (ioctl(af_inet_sock, SIOCGIFMEDIA, &ifmr) == -1) {
+ error = af_inet_ioctl(SIOCGIFMEDIA, &ifmr);
+ if (error) {
VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFMEDIA) failed: %s",
- netdev_get_name(netdev), ovs_strerror(errno));
- error = errno;
+ netdev_get_name(netdev), ovs_strerror(error));
goto cleanup;
}
int error;
ifr.ifr_addr.sa_family = AF_INET;
- error = netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev_), &ifr,
+ error = af_inet_ifreq_ioctl(netdev_get_kernel_name(netdev_), &ifr,
SIOCGIFADDR, "SIOCGIFADDR");
if (error) {
return error;
sin = (struct sockaddr_in *) &ifr.ifr_addr;
netdev->in4 = sin->sin_addr;
- error = netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev_), &ifr,
+ error = af_inet_ifreq_ioctl(netdev_get_kernel_name(netdev_), &ifr,
SIOCGIFNETMASK, "SIOCGIFNETMASK");
if (error) {
return error;
{
struct ifreq ifr;
make_in4_sockaddr(&ifr.ifr_addr, addr);
- return netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev), &ifr, ioctl_nr,
+ return af_inet_ifreq_ioctl(netdev_get_kernel_name(netdev), &ifr, ioctl_nr,
ioctl_name);
}
close(fd);
strcpy(ifr.ifr_name, name);
/* XXX What to do if this call fails? */
- ioctl(af_inet_sock, SIOCIFDESTROY, &ifr);
+ af_inet_ioctl(SIOCIFDESTROY, &ifr);
}
static int
struct ifreq ifr;
int error;
- error = netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev), &ifr,
+ error = af_inet_ifreq_ioctl(netdev_get_kernel_name(netdev), &ifr,
SIOCGIFFLAGS, "SIOCGIFFLAGS");
*flags = ifr_get_flags(&ifr);
ifr_set_flags(&ifr, flags);
- return netdev_bsd_do_ioctl(name, &ifr, SIOCSIFFLAGS, "SIOCSIFFLAGS");
+ return af_inet_ifreq_ioctl(name, &ifr, SIOCSIFFLAGS, "SIOCSIFFLAGS");
}
static int
{
#if defined(__FreeBSD__)
struct ifreq ifr;
+ int error;
memset(&ifr, 0, sizeof ifr);
strncpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
ifr.ifr_addr.sa_family = hwaddr_family;
ifr.ifr_addr.sa_len = hwaddr_len;
memcpy(ifr.ifr_addr.sa_data, mac, hwaddr_len);
- if (ioctl(af_inet_sock, SIOCSIFLLADDR, &ifr) < 0) {
+ error = af_inet_ioctl(SIOCSIFLLADDR, &ifr);
+ if (error) {
VLOG_ERR("ioctl(SIOCSIFLLADDR) on %s device failed: %s",
- netdev_name, ovs_strerror(errno));
- return errno;
+ netdev_name, ovs_strerror(error));
+ return error;
}
return 0;
#elif defined(__NetBSD__)
#endif
}
-static int
-netdev_bsd_do_ioctl(const char *name, struct ifreq *ifr, unsigned long cmd,
- const char *cmd_name)
-{
- strncpy(ifr->ifr_name, name, sizeof ifr->ifr_name);
- if (ioctl(af_inet_sock, cmd, ifr) == -1) {
- VLOG_DBG_RL(&rl, "%s: ioctl(%s) failed: %s", name, cmd_name,
- ovs_strerror(errno));
- return errno;
- }
- return 0;
-}
-
static int
ifr_get_flags(const struct ifreq *ifr)
{