- } else if (ethertype != NETDEV_ETH_TYPE_NONE) {
- struct sockaddr_ll sll;
- int protocol;
- int ifindex;
-
- /* Create file descriptor. */
- protocol = (ethertype == NETDEV_ETH_TYPE_ANY ? ETH_P_ALL
- : ethertype == NETDEV_ETH_TYPE_802_2 ? ETH_P_802_2
- : ethertype);
- netdev->fd = socket(PF_PACKET, SOCK_RAW,
- (OVS_FORCE int) htons(protocol));
- if (netdev->fd < 0) {
- error = errno;
- goto error;
- }
-
- /* Set non-blocking mode. */
- error = set_nonblocking(netdev->fd);
- if (error) {
- goto error;
- }
-
- /* Get ethernet device index. */
- error = get_ifindex(&netdev->netdev, &ifindex);
- if (error) {
- goto error;
- }
-
- /* Bind to specific ethernet device. */
- memset(&sll, 0, sizeof sll);
- sll.sll_family = AF_PACKET;
- sll.sll_ifindex = ifindex;
- if (bind(netdev->fd,
- (struct sockaddr *) &sll, sizeof sll) < 0) {
- error = errno;
- VLOG_ERR("bind to %s failed: %s", netdev_dev_get_name(netdev_dev_),
- strerror(error));
- goto error;
- }
-
- /* Between the socket() and bind() calls above, the socket receives all
- * packets of the requested type on all system interfaces. We do not
- * want to receive that data, but there is no way to avoid it. So we
- * must now drain out the receive queue. */
- error = drain_rcvbuf(netdev->fd);
- if (error) {
- goto error;
- }