+static int
+netdev_bsd_rx_open(struct netdev *netdev_, struct netdev_rx **rxp)
+{
+ struct netdev_dev_bsd *netdev_dev =
+ netdev_dev_bsd_cast(netdev_get_dev(netdev_));
+
+ struct netdev_rx_bsd *rx;
+ pcap_t *pcap;
+ int fd;
+
+ if (!strcmp(netdev_get_type(netdev_), "tap")) {
+ pcap = NULL;
+ fd = netdev_dev->tap_fd;
+ } else {
+ int error = netdev_bsd_open_pcap(netdev_get_name(netdev_), &pcap, &fd);
+ if (error) {
+ return error;
+ }
+
+ netdev_dev_bsd_changed(netdev_dev);
+ }
+
+ rx = xmalloc(sizeof *rx);
+ netdev_rx_init(&rx->up, netdev_get_dev(netdev_), &netdev_rx_bsd_class);
+ rx->pcap_handle = pcap;
+ rx->fd = fd;
+
+ *rxp = &rx->up;
+ return 0;
+}
+
+static void
+netdev_rx_bsd_destroy(struct netdev_rx *rx_)
+{
+ struct netdev_rx_bsd *rx = netdev_rx_bsd_cast(rx_);
+
+ if (rx->pcap_handle) {
+ pcap_close(rx->pcap_handle);
+ }
+ free(rx);
+}