[fuchsia] Move ethernetif.c to netstack repo

Change-Id: I44944dc773e8fc387a0ffbafb9a60fd1caef49fd
diff --git a/BUILD.gn b/BUILD.gn
index 2588b2b..7c12f05 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -11,8 +11,6 @@
 
 static_library("lwip") {
   sources = [
-    "ports/fuchsia/include/netif/ethernetif.h",
-    "ports/fuchsia/netif/ethernetif.c",
     "ports/fuchsia/sys_arch.c",
     "src/apps/lwiperf/lwiperf.c",
     "src/api/api_lib.c",
diff --git a/ports/fuchsia/include/netif/ethernetif.h b/ports/fuchsia/include/netif/ethernetif.h
deleted file mode 100644
index c810bef..0000000
--- a/ports/fuchsia/include/netif/ethernetif.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LWIP_ETHERNETIF_H
-#define LWIP_ETHERNETIF_H
-
-#include "lwip/netif.h"
-
-err_t ethernetif_init(struct netif *netif);
-
-#endif /* LWIP_ETHERNETIF_H */
diff --git a/ports/fuchsia/netif/ethernetif.c b/ports/fuchsia/netif/ethernetif.c
deleted file mode 100644
index 8233389..0000000
--- a/ports/fuchsia/netif/ethernetif.c
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/uio.h>
-#include <sys/socket.h>
-#include <dirent.h>
-
-#include <magenta/types.h>
-#include <magenta/syscalls.h>
-#include <magenta/processargs.h>
-#include <mxio/io.h>
-#include <mxio/util.h>
-
-#include "lwip/opt.h"
-
-#include "lwip/debug.h"
-#include "lwip/def.h"
-#include "lwip/ip.h"
-#include "lwip/mem.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-#include "lwip/pbuf.h"
-#include "lwip/sys.h"
-#include "lwip/timeouts.h"
-#include "netif/etharp.h"
-#include "lwip/ethip6.h"
-
-#include "netif/ethernetif.h"
-
-/* Define those to better describe your network interface. */
-#define IFNAME0 'e'
-#define IFNAME1 'n'
-
-#define IO_TYPE_FD 1
-#define IO_TYPE_CHANNEL 2
-
-struct ethernetif {
-  /* Add whatever per-interface state that is needed here. */
-  int io_type;
-  union {
-    int fd;
-    mx_handle_t h;
-  } io;
-};
-
-/* Forward declarations. */
-static void ethernetif_input(struct netif *netif);
-static void ethernetif_thread(void *arg);
-
-/*-----------------------------------------------------------------------------------*/
-static int read_packet(struct netif *netif, void *buf, size_t count)
-{
-  struct ethernetif *ethernetif = (struct ethernetif *)netif->state;
-
-  if (ethernetif->io_type == IO_TYPE_FD) {
-    return read(ethernetif->io.fd, buf, count);
-  }
-  if (ethernetif->io_type == IO_TYPE_CHANNEL) {
-    uint32_t sz = count;
-    mx_status_t r;
-    if ((r = mx_channel_read(ethernetif->io.h, 0, buf, sz, &sz, NULL, 0, NULL)) < 0)
-      return -1;
-    return sz;
-  }
-  printf("ethernetif: not initialized correctly\n");
-  return ERR_INTERNAL;
-}
-
-static int write_packet(struct netif *netif, const void *buf, size_t count)
-{
-  struct ethernetif *ethernetif = (struct ethernetif *)netif->state;
-
-  if (ethernetif->io_type == IO_TYPE_FD) {
-    return write(ethernetif->io.fd, buf, count);
-  }
-  if (ethernetif->io_type == IO_TYPE_CHANNEL) {
-    ssize_t r;
-    if ((r = mx_channel_write(ethernetif->io.h, 0, buf, count, NULL, 0)) < 0)
-      return -1;
-    return count;
-  }
-  printf("ethernetif: not initialized correctly\n");
-  return -1;
-}
-
-static int
-open_ethernet_device(u8_t *hwaddr, u8_t *hwaddr_len)
-{
-  DIR* dir;
-  struct dirent* de;
-  int fd = -1;
-
-  if ((dir = opendir("/dev/class/ethernet")) == NULL) {
-    printf("ethernetif_init: cannot open /dev/class/ethernet\n");
-    return -1;
-  }
-  while ((de = readdir(dir)) != NULL) {
-    if (de->d_name[0] == '.') {
-      continue;
-    }
-    if ((fd = openat(dirfd(dir), de->d_name, O_RDWR)) >= 0) {
-      break;
-    }
-  }
-  LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: fd %d\n", fd));
-  closedir(dir);
-
-  if (*hwaddr_len < 6 || read(fd, hwaddr, 6) != 6) {
-    printf("ethernetif_init: cannot read MAC address\n");
-    close(fd);
-    return -1;
-  }
-  LWIP_DEBUGF(NETIF_DEBUG,
-              ("ethernetif_init: mac: %02x:%02x:%02x:%02x:%02x:%02x\n",
-               hwaddr[0], hwaddr[1], hwaddr[2],
-               hwaddr[3], hwaddr[4], hwaddr[5]));
-  *hwaddr_len = 6;
-
-  return fd;
-}
-
-static void
-low_level_init(struct netif *netif)
-{
-  struct ethernetif *ethernetif = (struct ethernetif *)netif->state;
-
-  mx_handle_t h;
-  int fd;
-
-  netif->hwaddr_len = 6u;
-
-  if ((h = mxio_get_startup_handle(MX_HND_INFO(MX_HND_TYPE_USER0, 0))) !=
-      MX_HANDLE_INVALID) {
-    ethernetif->io_type = IO_TYPE_CHANNEL;
-    ethernetif->io.h = h;
-    printf("ethernetif_init: sending ipc signal\n");
-    mx_status_t status = mx_object_signal_peer(h, 0, MX_USER_SIGNAL_0);
-    if (status != NO_ERROR) {
-        printf("ethernetif_init: could not signal handle peer! %d\n", status);
-        return;
-    }
-    printf("ethernetif_init: using a startup handle\n");
-  } else if ((fd = open_ethernet_device(netif->hwaddr,
-                                        &netif->hwaddr_len)) >= 0) {
-    ethernetif->io_type = IO_TYPE_FD;
-    ethernetif->io.fd = fd;
-    printf("ethernetif_init: opened an ethernet devie\n");
-  } else {
-    printf("ethernetif_init: initialization failed\n");
-    return;
-  }
-
-  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
-
-  /* if the io type is fd, link up now */
-  if (ethernetif->io_type == IO_TYPE_FD)
-    netif_set_link_up(netif);
-
-  sys_thread_new("ethernetif_thread", ethernetif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
-}
-
-static err_t
-low_level_output(struct netif *netif, struct pbuf *p)
-{
-  char buf[1514]; /* MTU (1500) + header (14) */
-  ssize_t written;
-
-  pbuf_copy_partial(p, buf, p->tot_len, 0);
-
-  /*
-   * Pad spaces toward the minimum packet size (60 bytes without FCS)
-   * as the driver doesn't do it for us.
-   */
-#define MIN_WRITE_SIZE 60
-
-  int write_len = p->tot_len;
-  if (write_len < MIN_WRITE_SIZE) {
-    memset(buf + write_len, 0, MIN_WRITE_SIZE - write_len);
-    write_len = MIN_WRITE_SIZE;
-  }
-  written = write_packet(netif, buf, write_len);
-  if (written == -1) {
-    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
-    printf("ethernetif: write %d bytes returned -1\n", p->tot_len);
-  }
-  else {
-    MIB2_STATS_NETIF_ADD(netif, ifoutoctets, written);
-  }
-  return ERR_OK;
-}
-
-#define TIMER_MS(n) (((uint64_t)(n)) * 1000000ULL)
-
-static struct pbuf *
-low_level_input(struct netif *netif)
-{
-  struct pbuf *p;
-  int len;
-  /* TODO(toshik)
-   * The driver expects at least 2048 bytes for the buffer size. Reading less
-   * than that would fail (Currently 2048 is a magic number)
-   */
-  char buf[2048];
-
-  len = read_packet(netif, buf, sizeof(buf));
-  if (len < 0) {
-    /* TODO(toshik)
-     * Currently read() often fails because ethernetif_input() is called even
-     * if the fd is not readable.
-     */
-    /* LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: read returned %d\n", len)); */
-    return NULL;
-  }
-  if (len == 8) {
-    /* status message: mac (6 bytes) + mtu (2 bytes) */
-    unsigned int mtu = *(unsigned short int*)(buf+6);
-    if (mtu > 0) {
-      /* link up */
-      memcpy(netif->hwaddr, buf, 6);
-      printf("ethernetif: link up (mac %02x:%02x:%02x:%02x:%02x:%02x,"
-             " mtu %u)\n",
-             (uint8_t)buf[0], (uint8_t)buf[1], (uint8_t)buf[2], (uint8_t)buf[3],
-             (uint8_t)buf[4], (uint8_t)buf[5], mtu);
-      netif_set_link_up(netif);
-    } else {
-      /* link down */
-      printf("ethernetif: link down\n");
-      netif_set_link_down(netif);
-    }
-  }
-
-  MIB2_STATS_NETIF_ADD(netif, ifinoctets, len);
-
-  /* We allocate a pbuf chain of pbufs from the pool. */
-  p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
-  if (p != NULL) {
-    pbuf_take(p, buf, len);
-    /* acknowledge that packet has been read(); */
-  } else {
-    /* drop packet(); */
-    MIB2_STATS_NETIF_INC(netif, ifindiscards);
-    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: could not allocate pbuf\n"));
-  }
-
-  return p;
-}
-
-static void
-ethernetif_input(struct netif *netif)
-{
-  struct pbuf *p = low_level_input(netif);
-
-  if (p == NULL) {
-    /* TODO(toshik)
-     * Currently low_level_input() may return NULL often because
-     * ethernetif_input() is called even if the fd is not readable.
-     * Disable the following code for now.
-     */
-#if 0
-#if LINK_STATS
-    LINK_STATS_INC(link.recv);
-#endif /* LINK_STATS */
-    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: low_level_input returned NULL\n"));
-#endif
-    return;
-  }
-
-  if (netif->input(p, netif) != ERR_OK) {
-    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: netif input error\n"));
-    pbuf_free(p);
-  }
-}
-
-err_t
-ethernetif_init(struct netif *netif)
-{
-  struct ethernetif *ethernetif = (struct ethernetif *)mem_malloc(sizeof(struct ethernetif));
-
-  if (ethernetif == NULL) {
-    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory for ethernetif\n"));
-    return ERR_MEM;
-  }
-  ethernetif->io_type = -1;
-
-  netif->state = ethernetif;
-  MIB2_INIT_NETIF(netif, snmp_ifType_other, 100000000);
-
-  netif->name[0] = IFNAME0;
-  netif->name[1] = IFNAME1;
-  netif->output = etharp_output;
-  netif->output_ip6 = ethip6_output;
-  netif->linkoutput = low_level_output;
-  netif->mtu = 1500;
-
-  low_level_init(netif);
-
-  return ERR_OK;
-}
-
-/*-----------------------------------------------------------------------------------*/
-
-static void
-ethernetif_thread(void *arg)
-{
-  struct netif *netif;
-  struct ethernetif *ethernetif;
-
-  netif = (struct netif *)arg;
-  ethernetif = (struct ethernetif *)netif->state;
-
-  while(1) {
-    if (ethernetif->io_type == IO_TYPE_FD) {
-      mxio_wait_fd(ethernetif->io.fd, MXIO_EVT_READABLE, NULL,
-                   MX_TIME_INFINITE);
-    } else if (ethernetif->io_type == IO_TYPE_CHANNEL) {
-      mx_status_t r;
-      mx_signals_t pending;
-      r = mx_handle_wait_one(ethernetif->io.h,
-                             MX_CHANNEL_READABLE | MX_CHANNEL_PEER_CLOSED,
-                             MX_TIME_INFINITE, &pending);
-      if (r < 0) {
-        printf("ethernetif: handle wait error (%d)\n", r);
-        return;
-      }
-      if (pending & MX_CHANNEL_PEER_CLOSED) {
-        printf("ethernetif: handle closed\n");
-        return;
-      }
-    }
-    /* TODO(toshik) mxio_wait_fd() might return even if the fd is not readable.
-     * we should check why it returned, but it is not possible as errno is not
-     * set currently.
-     */
-    ethernetif_input(netif);
-  }
-}