extmod/modlwip: slip: Use stream protocol and be port-independent.

Based on the original patch by Galen Hazelwood:
https://github.com/micropython/micropython/pull/1517 .
diff --git a/py/builtin.h b/py/builtin.h
index 20ff1f7..891b93e 100644
--- a/py/builtin.h
+++ b/py/builtin.h
@@ -103,5 +103,6 @@
 extern const mp_obj_module_t mp_module_ubinascii;
 extern const mp_obj_module_t mp_module_ussl;
 extern const mp_obj_module_t mp_module_machine;
+extern const mp_obj_module_t mp_module_lwip;
 
 #endif // __MICROPY_INCLUDED_PY_BUILTIN_H__
diff --git a/py/mpstate.h b/py/mpstate.h
index dd185a7..9a8cc02 100644
--- a/py/mpstate.h
+++ b/py/mpstate.h
@@ -127,6 +127,11 @@
     // include any root pointers defined by a port
     MICROPY_PORT_ROOT_POINTERS
 
+    // root pointers for extmod
+    #if MICROPY_PY_LWIP_SLIP
+    mp_obj_t lwip_slip_stream;
+    #endif
+
     //
     // END ROOT POINTER SECTION
     ////////////////////////////////////////////////////////////
diff --git a/py/objmodule.c b/py/objmodule.c
index 63cccde..02a106d 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -189,6 +189,9 @@
 #if MICROPY_PY_USSL
     { MP_OBJ_NEW_QSTR(MP_QSTR_ussl), (mp_obj_t)&mp_module_ussl },
 #endif
+#if MICROPY_PY_LWIP
+    { MP_OBJ_NEW_QSTR(MP_QSTR_lwip), (mp_obj_t)&mp_module_lwip },
+#endif
 
     // extra builtin modules as defined by a port
     MICROPY_PORT_BUILTIN_MODULES
diff --git a/py/py.mk b/py/py.mk
index b3a9919..00a8c59 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -17,6 +17,46 @@
 LDFLAGS_MOD += -L../lib/axtls/_stage -laxtls
 endif
 
+#ifeq ($(MICROPY_PY_LWIP),1)
+#CFLAGS_MOD += -DMICROPY_PY_LWIP=1 -I../lib/lwip/src/include -I../lib/lwip/src/include/ipv4 -I../extmod/lwip-include
+#endif
+
+ifeq ($(MICROPY_PY_LWIP),1)
+LWIP_DIR = lib/lwip/src
+INC += -I../lib/lwip/src/include -I../lib/lwip/src/include/ipv4 -I../extmod/lwip-include
+CFLAGS_MOD += -DMICROPY_PY_LWIP=1
+SRC_MOD += extmod/modlwip.c lib/netutils/netutils.c
+SRC_MOD += $(addprefix $(LWIP_DIR)/,\
+	core/def.c \
+	core/dns.c \
+	core/init.c \
+	core/mem.c \
+	core/memp.c \
+	core/netif.c \
+	core/pbuf.c \
+	core/raw.c \
+	core/stats.c \
+	core/sys.c \
+	core/tcp.c \
+	core/tcp_in.c \
+	core/tcp_out.c \
+	core/timers.c \
+	core/udp.c \
+	core/ipv4/autoip.c \
+	core/ipv4/icmp.c \
+	core/ipv4/igmp.c \
+	core/ipv4/inet.c \
+	core/ipv4/inet_chksum.c \
+	core/ipv4/ip_addr.c \
+	core/ipv4/ip.c \
+	core/ipv4/ip_frag.c \
+	)
+ifeq ($(MICROPY_PY_LWIP_SLIP),1)
+CFLAGS_MOD += -DMICROPY_PY_LWIP_SLIP=1
+SRC_MOD += $(LWIP_DIR)/netif/slipif.c
+endif
+endif
+
 # py object files
 PY_O_BASENAME = \
 	mpstate.o \
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 161d231..e91cfa8 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -614,3 +614,32 @@
 Q(ussl)
 Q(wrap_socket)
 #endif
+
+#if MICROPY_PY_LWIP
+// for lwip module
+Q(lwip)
+Q(reset)
+Q(callback)
+Q(socket)
+Q(AF_INET)
+Q(AF_INET6)
+Q(SOCK_STREAM)
+Q(SOCK_DGRAM)
+Q(SOCK_RAW)
+// for lwip.socket
+Q(close)
+Q(bind)
+Q(listen)
+Q(accept)
+Q(connect)
+Q(send)
+Q(recv)
+Q(sendto)
+Q(recvfrom)
+Q(settimeout)
+#if MICROPY_PY_LWIP_SLIP
+// for lwip.slip
+Q(slip)
+Q(status)
+#endif
+#endif