[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/lwip/netif.c b/src/bsp/lk/lib/lwip/netif.c
new file mode 100644
index 0000000..05aa63a
--- /dev/null
+++ b/src/bsp/lk/lib/lwip/netif.c
@@ -0,0 +1,152 @@
+#include <dev/class/netif.h>
+#include <kernel/event.h>
+#include <arch/ops.h>
+#include <netif/etharp.h>
+#include <lwip/netif.h>
+#include <lwip/dhcp.h>
+#include <debug.h>
+#include <trace.h>
+#include <assert.h>
+#include <list.h>
+#include <err.h>
+
+#define LOCAL_TRACE 0
+
+struct local_netif {
+	struct netif netif;
+	struct device *dev;
+};
+
+static event_t netif_up_event = EVENT_INITIAL_VALUE(netif_up_event, false, 0);
+static volatile int netif_up_count = 0;
+
+static err_t local_linkoutput(struct netif *netif, struct pbuf *p)
+{
+	LTRACE_ENTRY;
+
+	struct local_netif *nif = containerof(netif, struct local_netif, netif);
+	DEBUG_ASSERT(nif);
+
+	status_t res = class_netif_output(nif->dev, p);
+
+	LTRACE_EXIT;
+	
+	switch (res) {
+		case NO_ERROR: return ERR_OK;
+		case ERR_NO_MEMORY: return ERR_MEM;
+		case ERR_TIMED_OUT: return ERR_TIMEOUT;
+		default: return ERR_IF;
+	}
+}
+
+static void local_netif_status(struct netif *netif)
+{
+	struct local_netif *nif = containerof(netif, struct local_netif, netif);
+	DEBUG_ASSERT(nif);
+
+	if (netif->flags & NETIF_FLAG_UP) {
+		TRACEF("netif %c%c ip %u.%u.%u.%u netmask %u.%u.%u.%u gw %u.%u.%u.%u\n",
+				netif->name[0], netif->name[1],
+				ip4_addr1_16(&netif->ip_addr),
+				ip4_addr2_16(&netif->ip_addr),
+				ip4_addr3_16(&netif->ip_addr),
+				ip4_addr4_16(&netif->ip_addr),
+				ip4_addr1_16(&netif->netmask),
+				ip4_addr2_16(&netif->netmask),
+				ip4_addr3_16(&netif->netmask),
+				ip4_addr4_16(&netif->netmask),
+				ip4_addr1_16(&netif->gw),
+				ip4_addr2_16(&netif->gw),
+				ip4_addr3_16(&netif->gw),
+				ip4_addr4_16(&netif->gw));
+
+		if (atomic_add(&netif_up_count, 1) >= 0)
+			event_signal(&netif_up_event, true);
+	} else {
+		if (atomic_add(&netif_up_count, -1) == 1)
+			event_unsignal(&netif_up_event);
+	}
+}
+
+static err_t local_netif_init(struct netif *netif)
+{
+	LTRACE_ENTRY;
+
+	struct local_netif *nif = containerof(netif, struct local_netif, netif);
+	DEBUG_ASSERT(nif);
+	
+	netif->linkoutput = local_linkoutput;
+	netif->output = etharp_output;
+
+	netif->hwaddr_len = class_netif_get_hwaddr(nif->dev, netif->hwaddr, sizeof(netif->hwaddr));
+	netif->mtu = class_netif_get_mtu(nif->dev);
+
+	netif->name[0] = 'e';
+	netif->name[1] = 'n';
+	netif->num = 0;
+	netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
+
+	LTRACE_EXIT;
+
+	return ERR_OK;
+}
+
+status_t class_netstack_wait_for_network(lk_time_t timeout)
+{
+	status_t res;
+
+	LTRACE_ENTRY;
+
+	res = event_wait_timeout(&netif_up_event, timeout);
+	LTRACEF("res=%d\n", res);
+
+	LTRACE_EXIT;
+	return res;
+}
+
+status_t class_netif_add(struct device *dev)
+{
+	status_t err;
+	ip_addr_t ipaddr, netmask, gw;
+
+	struct local_netif *nif = malloc(sizeof(struct local_netif));
+	if (!nif)
+		return ERR_NO_MEMORY;
+	
+	nif->dev = dev;
+
+	err = class_netif_set_state(dev, (struct netstack_state *) nif);
+	if (err)
+		goto done;
+	
+	IP4_ADDR(&gw, 0, 0, 0, 0);
+	IP4_ADDR(&ipaddr, 0, 0, 0, 0);
+	IP4_ADDR(&netmask, 255, 255, 255, 255);
+
+	netif_add(&nif->netif, &ipaddr, &netmask, &gw, nif, local_netif_init, ethernet_input);
+	netif_set_default(&nif->netif);
+	netif_set_status_callback(&nif->netif, local_netif_status);
+	dhcp_start(&nif->netif);
+
+	err = NO_ERROR;
+
+done:
+	return err;
+}
+
+status_t class_netstack_input(struct device *dev, struct netstack_state *state, struct pbuf *p)
+{
+	LTRACE_ENTRY;
+
+	struct local_netif *nif = (struct local_netif *) state;
+	if (!nif)
+		return ERR_INVALID_ARGS;
+
+	if (nif->netif.input(p, &nif->netif) != ERR_OK)
+		pbuf_free(p);
+	
+	LTRACE_EXIT;
+
+	return NO_ERROR;
+}
+