summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Henry <joseph.henry@zerotier.com>2015-09-15 18:27:52 -0400
committerJoseph Henry <joseph.henry@zerotier.com>2015-09-15 18:27:52 -0400
commit11731af45ae2638fa5a20abf8944725ef3cccdd6 (patch)
tree21150583abbd088341e06ecd143437c7c2efaba8
parent735ae9b3698e79e9a6be9386e65540d4dd51b401 (diff)
downloadinfinitytier-11731af45ae2638fa5a20abf8944725ef3cccdd6.tar.gz
infinitytier-11731af45ae2638fa5a20abf8944725ef3cccdd6.zip
it's alive!
-rw-r--r--make-linux.mk2
-rw-r--r--netcon/LWIPStack.hpp3
-rw-r--r--netcon/NetconEthernetTap.cpp50
-rw-r--r--netcon/NetconEthernetTap.hpp28
4 files changed, 63 insertions, 20 deletions
diff --git a/make-linux.mk b/make-linux.mk
index 74538287..6d042e89 100644
--- a/make-linux.mk
+++ b/make-linux.mk
@@ -111,7 +111,7 @@ installer: one FORCE
./ext/installfiles/linux/buildinstaller.sh
clean:
- rm -rf *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-cli zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm
+ rm -rf *.o netcon/*.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-cli zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm
debug: FORCE
make ZT_DEBUG=1 one
diff --git a/netcon/LWIPStack.hpp b/netcon/LWIPStack.hpp
index 38bb8547..a938dd1e 100644
--- a/netcon/LWIPStack.hpp
+++ b/netcon/LWIPStack.hpp
@@ -95,6 +95,7 @@ typedef ip_addr ip_addr_t;
#define NETIF_SET_DEFAULT_SIG struct netif *netif
#define NETIF_ADD_SIG struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input
#define NETIF_SET_UP_SIG struct netif *netif
+#define NETIF_POLL_SIG struct netif *netif
@@ -138,6 +139,7 @@ public:
void (*netif_set_default)(NETIF_SET_DEFAULT_SIG);
struct netif * (*netif_add)(NETIF_ADD_SIG);
void (*netif_set_up)(NETIF_SET_UP_SIG);
+ void (*netif_poll)(NETIF_POLL_SIG);
@@ -184,6 +186,7 @@ public:
netif_set_default = (void(*)(NETIF_SET_DEFAULT_SIG))dlsym(libref, "netif_set_default");
netif_add = (struct netif*(*)(NETIF_ADD_SIG))dlsym(libref, "netif_add");
netif_set_up = (void(*)(NETIF_SET_UP_SIG))dlsym(libref, "netif_set_up");
+ netif_poll = (void(*)(NETIF_POLL_SIG))dlsym(libref, "netif_poll");
}
};
diff --git a/netcon/NetconEthernetTap.cpp b/netcon/NetconEthernetTap.cpp
index 2f47f212..5b6e43bb 100644
--- a/netcon/NetconEthernetTap.cpp
+++ b/netcon/NetconEthernetTap.cpp
@@ -173,35 +173,48 @@ void NetconEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType
// Copy data into a pbuf chain
struct pbuf *p, *q;
//u16_t len;
- char buf[1514];
- char *bufptr;
+ //char buf[1514];
+ const char *bufptr;
+ // Assemble ethernet header and call netif->output
+ struct eth_hdr *ethhdr = NULL;
// We allocate a pbuf chain of pbufs from the pool.
- p = lwipstack->pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
+ p = lwipstack->pbuf_alloc(PBUF_RAW, len+sizeof(struct eth_hdr), PBUF_POOL);
if(p != NULL) {
+ fprintf(stderr, "p != NULL\n");
/* We iterate over the pbuf chain until we have read the entire
packet into the pbuf. */
- bufptr = &buf[0];
+ bufptr = (const char *)data;
for(q = p; q != NULL; q = q->next) {
/* Read enough bytes to fill this pbuf in the chain. The
available data in the pbuf is given by the q->len
variable. */
/* read data into(q->payload, q->len); */
- memcpy(q->payload, bufptr, q->len);
- bufptr += q->len;
+ char *pload = (char*)q->payload;
+ int plen = q->len;
+ if (!ethhdr) {
+ ethhdr = (struct eth_hdr *)p->payload;
+ pload += sizeof(struct eth_hdr);
+ plen -= sizeof(struct eth_hdr);
+ }
+ memcpy(pload, bufptr, plen);
+ bufptr += plen;
}
/* acknowledge that packet has been read(); */
} else {
+ return;
/* drop packet(); */
}
- // Assemble ethernet header and call netif->output
- struct eth_hdr *ethhdr;
- ethhdr = (struct eth_hdr *)p->payload;
from.copyTo(ethhdr->src.addr, 6);
_mac.copyTo(ethhdr->dest.addr, 6);
- ethhdr->type = ZT_ETHERTYPE_IPV4;
+ ethhdr->type = Utils::hton((uint16_t)etherType);
+
+ fprintf(stderr, "from = %s\n", from.toString().c_str());
+ fprintf(stderr, "_mac = %s\n", _mac.toString().c_str());
+ fprintf(stderr, "ethhdr->type = %x\n", ethhdr->type);
+ fprintf(stderr, "ethhdr->type = %x\n", ethhdr->type);
if(interface.input(p, &interface) != ERR_OK) {
fprintf(stderr, "IP error (netif->input)\n");
@@ -351,14 +364,20 @@ void NetconEthernetTap::threadMain()
lwipstack->netif_add(&interface,&ipaddr, &netmask, &gw, NULL, tapif_init, lwipstack->ethernet_input);
interface.state = this;
+ interface.output = lwipstack->etharp_output;
+ _mac.copyTo(interface.hwaddr, 6);
+ interface.mtu = 2800;
+
+ /*
interface.name[0] = 't';
interface.name[1] = 'p';
interface.output = lwipstack->etharp_output;
interface.linkoutput = low_level_output;
- interface.mtu = 1500;
+
interface.hwaddr_len = 6;
- _mac.copyTo(interface.hwaddr, 6);
+
interface.flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
+ */
fprintf(stderr, "netif_set_default\n");
lwipstack->netif_set_default(&interface);
@@ -377,16 +396,17 @@ void NetconEthernetTap::threadMain()
if(since_tcp > tcp_time)
{
prev_tcp_time = curr_time+1;
- fprintf(stderr, "tcp_tmr\n");
+ //fprintf(stderr, "tcp_tmr\n");
lwipstack->tcp_tmr();
}
if(since_etharp > etharp_time)
{
prev_etharp_time = curr_time;
- fprintf(stderr, "etharp_tmr\n");
+ //fprintf(stderr, "etharp_tmr\n");
lwipstack->etharp_tmr();
}
- fprintf(stderr, "_run\n");
+ //fprintf(stderr, "_run\n");
+ //lwipstack->netif_poll(&interface);
_phy.poll(100); // conversion from usec to millisec, TODO: double check
}
diff --git a/netcon/NetconEthernetTap.hpp b/netcon/NetconEthernetTap.hpp
index 4ca61ef2..273dd8f4 100644
--- a/netcon/NetconEthernetTap.hpp
+++ b/netcon/NetconEthernetTap.hpp
@@ -186,6 +186,9 @@ private:
------------------------ low-level Interface functions -------------------------
------------------------------------------------------------------------------*/
+static err_t low_level_output(struct netif *netif, struct pbuf *p);
+
+
static void low_level_init(struct netif *netif)
{
fprintf(stderr, "low_level_init\n");
@@ -193,14 +196,25 @@ private:
static err_t tapif_init(struct netif *netif)
{
- fprintf(stderr, "tapif_init\n");
+ //netif->state = tapif;
+ netif->name[0] = 't';
+ netif->name[1] = 'p';
+ //netif->output = netif->state.lwipstack->etharp_output;
+ netif->linkoutput = low_level_output;
+ //netif->mtu = 1500;
+ /* hardware address length */
+ netif->hwaddr_len = 6;
+
+ //tapif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
+ //low_level_init(netif);
return ERR_OK;
}
static err_t low_level_output(struct netif *netif, struct pbuf *p)
{
struct pbuf *q;
- char buf[1514];
+ char buf[2800+14];
char *bufptr;
//struct tapif *tapif;
int tot_len = 0;
@@ -233,8 +247,14 @@ private:
src_mac.setTo(ethhdr->src.addr, 6);
dest_mac.setTo(ethhdr->dest.addr, 6);
- tap->_handler(tap->_arg,tap->_nwid,src_mac,dest_mac,ZT_ETHERTYPE_IPV4,0,buf,p->tot_len);
- fprintf(stderr, "low_level_output(%d)\n", tap->_nwid);
+ tap->_handler(tap->_arg,tap->_nwid,src_mac,dest_mac,Utils::ntoh((uint16_t)ethhdr->type),0,buf + sizeof(struct eth_hdr),p->tot_len);
+ fprintf(stderr, "ethhdr->type = %x\n", ethhdr->type);
+ fprintf(stderr, "p->tot_len = %x\n", p->tot_len);
+ fprintf(stderr, "src_mac = %s\n", src_mac.toString().c_str());
+ fprintf(stderr, "dest_mac = %s\n", dest_mac.toString().c_str());
+
+ //fprintf(stderr, "htons(ethhdr->type) = %x\n", Utils::hton((uint16_t)ethhdr->type));
+ fprintf(stderr, "low_level_output(%x)\n", tap->_nwid);
return ERR_OK;
}