/*
- * Copyright (c) 2011, 2013 Gaetano Catalli.
+ * Copyright (c) 2011, 2013, 2014 Gaetano Catalli.
* Copyright (c) 2013, 2014 YAMAMOTO Takashi.
*
* Licensed under the Apache License, Version 2.0 (the "License");
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/sockio.h>
+#include <net/bpf.h>
#include <ifaddrs.h>
#include <pcap/pcap.h>
#include <net/if.h>
#endif
#include "rtbsd.h"
-#include "connectivity.h"
#include "coverage.h"
#include "dpif-netdev.h"
#include "dynamic-string.h"
#include "ovs-thread.h"
#include "packets.h"
#include "poll-loop.h"
-#include "seq.h"
#include "shash.h"
#include "socket-util.h"
#include "svec.h"
if (is_netdev_bsd_class(netdev_class)) {
dev = netdev_bsd_cast(base_dev);
dev->cache_valid = 0;
- seq_change(connectivity_seq_get());
+ netdev_change_seq_changed(base_dev);
}
netdev_close(base_dev);
}
struct netdev *netdev = node->data;
dev = netdev_bsd_cast(netdev);
dev->cache_valid = 0;
- seq_change(connectivity_seq_get());
+ netdev_change_seq_changed(netdev);
netdev_close(netdev);
}
shash_destroy(&device_shash);
static void
proc_pkt(u_char *args_, const struct pcap_pkthdr *hdr, const u_char *packet)
{
- struct pcap_arg *args = (struct pcap_arg *)args_;
+ struct pcap_arg *args = ALIGNED_CAST(struct pcap_arg *, args_);
if (args->size < hdr->len) {
VLOG_WARN_RL(&rl, "packet truncated");
/* prepare the pcap argument to store the packet */
arg.size = ofpbuf_tailroom(buffer);
- arg.data = buffer->data;
+ arg.data = ofpbuf_data(buffer);
for (;;) {
ret = pcap_dispatch(rxq->pcap_handle, 1, proc_pkt, (u_char *) &arg);
if (ret > 0) {
- buffer->size += arg.retval;
+ ofpbuf_set_size(buffer, ofpbuf_size(buffer) + arg.retval);
return 0;
}
if (ret == -1) {
size_t size = ofpbuf_tailroom(buffer);
for (;;) {
- ssize_t retval = read(rxq->fd, buffer->data, size);
+ ssize_t retval = read(rxq->fd, ofpbuf_data(buffer), size);
if (retval >= 0) {
- buffer->size += retval;
+ ofpbuf_set_size(buffer, ofpbuf_size(buffer) + retval);
return 0;
} else if (errno != EINTR) {
if (errno != EAGAIN) {
{
struct netdev_bsd *dev = netdev_bsd_cast(netdev_);
const char *name = netdev_get_name(netdev_);
- const void *data = pkt->data;
- size_t size = pkt->size;
+ const void *data = ofpbuf_data(pkt);
+ size_t size = ofpbuf_size(pkt);
int error;
ovs_mutex_lock(&dev->mutex);
}
}
} else if (retval != size) {
- VLOG_WARN_RL(&rl, "sent partial Ethernet packet (%"PRIuSIZE"d bytes of "
+ VLOG_WARN_RL(&rl, "sent partial Ethernet packet (%"PRIuSIZE" bytes of "
"%"PRIuSIZE") on %s", retval, size, name);
error = EMSGSIZE;
} else {
if (!error) {
netdev->cache_valid |= VALID_ETHERADDR;
memcpy(netdev->etheraddr, mac, ETH_ADDR_LEN);
- seq_change(connectivity_seq_get());
+ netdev_change_seq_changed(netdev_);
}
}
ovs_mutex_unlock(&netdev->mutex);
}
ovs_mutex_unlock(&netdev->mutex);
- return 0;
+ return error;
}
static int
netdev_get_name(netdev_), ovs_strerror(errno));
return errno;
} else if (!strcmp(ifmd.ifmd_name, netdev_get_name(netdev_))) {
- convert_stats(netdev, stats, &ifdr.ifdr_data);
+ convert_stats(netdev_, stats, &ifmd.ifmd_data);
break;
}
}
if (!error) {
const struct sockaddr_in *sin;
- sin = (struct sockaddr_in *) &ifr.ifr_addr;
+ sin = ALIGNED_CAST(struct sockaddr_in *, &ifr.ifr_addr);
netdev->in4 = sin->sin_addr;
netdev->cache_valid |= VALID_IN4;
error = af_inet_ifreq_ioctl(netdev_get_kernel_name(netdev_), &ifr,
netdev->netmask = mask;
}
}
- seq_change(connectivity_seq_get());
+ netdev_change_seq_changed(netdev_);
}
ovs_mutex_unlock(&netdev->mutex);
for (ifa = head; ifa; ifa = ifa->ifa_next) {
if (ifa->ifa_addr->sa_family == AF_INET6 &&
!strcmp(ifa->ifa_name, netdev_name)) {
- sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
+ sin6 = ALIGNED_CAST(struct sockaddr_in6 *, ifa->ifa_addr);
if (sin6) {
memcpy(&netdev->in6, &sin6->sin6_addr, sin6->sin6_len);
netdev->cache_valid |= VALID_IN6;
if ((i == RTA_GATEWAY) && sa->sa_family == AF_INET) {
const struct sockaddr_in * const sin =
- (const struct sockaddr_in *)sa;
+ ALIGNED_CAST(const struct sockaddr_in *, sa);
*next_hop = sin->sin_addr;
gateway = true;
}
if ((i == RTA_IFP) && sa->sa_family == AF_LINK) {
const struct sockaddr_dl * const sdl =
- (const struct sockaddr_dl *)sa;
+ ALIGNED_CAST(const struct sockaddr_dl *, sa);
char *kernel_name;
kernel_name = xmemdup0(sdl->sdl_data, sdl->sdl_nlen);
new_flags = (old_flags & ~nd_to_iff_flags(off)) | nd_to_iff_flags(on);
if (new_flags != old_flags) {
error = set_flags(netdev_get_kernel_name(netdev_), new_flags);
- seq_change(connectivity_seq_get());
+ netdev_change_seq_changed(netdev_);
}
}
return error;
for (ifa = head; ifa; ifa = ifa->ifa_next) {
if (ifa->ifa_addr->sa_family == AF_LINK) {
if (!strcmp(ifa->ifa_name, netdev_name)) {
- sdl = (struct sockaddr_dl *)ifa->ifa_addr;
+ sdl = ALIGNED_CAST(struct sockaddr_dl *, ifa->ifa_addr);
if (sdl) {
memcpy(ea, LLADDR(sdl), sdl->sdl_alen);
freeifaddrs(head);
ifr_get_flags(const struct ifreq *ifr)
{
#ifdef HAVE_STRUCT_IFREQ_IFR_FLAGSHIGH
- return (ifr->ifr_flagshigh << 16) | ifr->ifr_flags;
+ return (ifr->ifr_flagshigh << 16) | (ifr->ifr_flags & 0xffff);
#else
return ifr->ifr_flags;
#endif
static void
ifr_set_flags(struct ifreq *ifr, int flags)
{
- ifr->ifr_flags = flags;
#ifdef HAVE_STRUCT_IFREQ_IFR_FLAGSHIGH
+ ifr->ifr_flags = flags & 0xffff;
ifr->ifr_flagshigh = flags >> 16;
+#else
+ ifr->ifr_flags = flags;
#endif
}
+#if defined(__NetBSD__)
/* Calls ioctl() on an AF_LINK sock, passing the specified 'command' and
* 'arg'. Returns 0 if successful, otherwise a positive errno value. */
int
: ioctl(sock, command, arg) == -1 ? errno
: 0);
}
+#endif