/* Used for sending packets on non-tap devices. */
pcap_t *pcap;
int fd;
+
+ char *kernel_name;
};
return CONTAINER_OF(rx, struct netdev_rx_bsd, up);
}
+static const char *
+netdev_get_kernel_name(const struct netdev *netdev)
+{
+ return netdev_bsd_cast(netdev)->kernel_name;
+}
+
/* Initialize the AF_INET socket used for ioctl operations */
static int
netdev_bsd_init(void)
netdev->change_seq = 1;
netdev_init(&netdev->up, name, class);
netdev->tap_fd = -1;
+ netdev->kernel_name = xstrdup(name);
/* Verify that the netdev really exists by attempting to read its flags */
error = netdev_get_flags(&netdev->up, &flags);
struct netdev_bsd *netdev = NULL;
int error = 0;
struct ifreq ifr;
+ char *kernel_name = NULL;
error = cache_notifier_ref();
if (error) {
destroy_tap(netdev->tap_fd, ifr.ifr_name);
goto error_undef_notifier;
}
+ kernel_name = xstrdup(name);
#else
/*
- * XXX
* NetBSD doesn't support inteface renaming.
*/
VLOG_INFO("tap %s is created for bridge %s", ifr.ifr_name, name);
- name = ifr.ifr_name; /* XXX */
+ kernel_name = xstrdup(ifr.ifr_name);
#endif
/* set non-blocking. */
error = set_nonblocking(netdev->tap_fd);
if (error) {
- destroy_tap(netdev->tap_fd, name);
+ destroy_tap(netdev->tap_fd, kernel_name);
goto error_undef_notifier;
}
/* Turn device UP */
ifr_set_flags(&ifr, IFF_UP);
- strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
+ strncpy(ifr.ifr_name, kernel_name, sizeof ifr.ifr_name);
if (ioctl(af_inet_sock, SIOCSIFFLAGS, &ifr) == -1) {
error = errno;
- destroy_tap(netdev->tap_fd, name);
+ destroy_tap(netdev->tap_fd, kernel_name);
goto error_undef_notifier;
}
/* initialize the device structure and
* link the structure to its netdev */
netdev_init(&netdev->up, name, class);
+ netdev->kernel_name = kernel_name;
*netdevp = &netdev->up;
return 0;
cache_notifier_unref();
error:
free(netdev);
+ free(kernel_name);
return error;
}
cache_notifier_unref();
if (netdev->tap_fd >= 0) {
- destroy_tap(netdev->tap_fd, netdev_get_name(netdev_));
+ destroy_tap(netdev->tap_fd, netdev_get_kernel_name(netdev_));
}
if (netdev->pcap) {
pcap_close(netdev->pcap);
}
+ free(netdev->kernel_name);
free(netdev);
}
pcap = NULL;
fd = netdev->tap_fd;
} else {
- int error = netdev_bsd_open_pcap(netdev_get_name(netdev_), &pcap, &fd);
+ int error = netdev_bsd_open_pcap(netdev_get_kernel_name(netdev_),
+ &pcap, &fd);
if (error) {
return error;
}
struct ifreq ifr;
struct netdev_rx_bsd *rx = netdev_rx_bsd_cast(rx_);
- strcpy(ifr.ifr_name, netdev_rx_get_name(rx_));
+ strcpy(ifr.ifr_name, netdev_get_kernel_name(netdev_rx_get_netdev(rx_)));
if (ioctl(rx->fd, BIOCFLUSH, &ifr) == -1) {
VLOG_DBG_RL(&rl, "%s: ioctl(BIOCFLUSH) failed: %s",
netdev_rx_get_name(rx_), strerror(errno));
if (!(netdev->cache_valid & VALID_ETHERADDR)
|| !eth_addr_equals(netdev->etheraddr, mac)) {
- error = set_etheraddr(netdev_get_name(netdev_), AF_LINK, ETH_ADDR_LEN,
- mac);
+ error = set_etheraddr(netdev_get_kernel_name(netdev_), AF_LINK,
+ ETH_ADDR_LEN, mac);
if (!error) {
netdev->cache_valid |= VALID_ETHERADDR;
memcpy(netdev->etheraddr, mac, ETH_ADDR_LEN);
struct netdev_bsd *netdev = netdev_bsd_cast(netdev_);
if (!(netdev->cache_valid & VALID_ETHERADDR)) {
- int error = get_etheraddr(netdev_get_name(netdev_),
+ int error = get_etheraddr(netdev_get_kernel_name(netdev_),
netdev->etheraddr);
if (error) {
return error;
struct ifreq ifr;
int error;
- error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr, SIOCGIFMTU,
- "SIOCGIFMTU");
+ error = netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev_), &ifr,
+ SIOCGIFMTU, "SIOCGIFMTU");
if (error) {
return error;
}
struct ifmediareq ifmr;
memset(&ifmr, 0, sizeof(ifmr));
- strncpy(ifmr.ifm_name, netdev_get_name(netdev_), sizeof ifmr.ifm_name);
+ strncpy(ifmr.ifm_name, netdev_get_kernel_name(netdev_),
+ sizeof ifmr.ifm_name);
if (ioctl(af_inet_sock, SIOCGIFMEDIA, &ifmr) == -1) {
VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFMEDIA) failed: %s",
int error;
ifr.ifr_addr.sa_family = AF_INET;
- error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr,
+ error = netdev_bsd_do_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;
netdev->cache_valid |= VALID_IN4;
- error = netdev_bsd_do_ioctl(netdev_get_name(netdev_), &ifr,
+ error = netdev_bsd_do_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, &ifr, ioctl_nr, ioctl_name);
+ return netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev), &ifr, ioctl_nr,
+ ioctl_name);
}
static int
*old_flagsp = iff_to_nd_flags(old_flags);
new_flags = (old_flags & ~nd_to_iff_flags(off)) | nd_to_iff_flags(on);
if (new_flags != old_flags) {
- error = set_flags(netdev_get_name(netdev_), new_flags);
+ error = set_flags(netdev_get_kernel_name(netdev_), new_flags);
netdev_bsd_changed(netdev);
}
}
struct ifreq ifr;
int error;
- error = netdev_bsd_do_ioctl(netdev->name, &ifr,
+ error = netdev_bsd_do_ioctl(netdev_get_kernel_name(netdev), &ifr,
SIOCGIFFLAGS, "SIOCGIFFLAGS");
*flags = ifr_get_flags(&ifr);