A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.
Dependents: oldheating gps motorhome heating
Diff: eth/eth.cpp
- Revision:
- 14:e75a59c1123d
- Parent:
- 13:9cd54f7db57a
- Child:
- 16:f416ef583c89
diff -r 9cd54f7db57a -r e75a59c1123d eth/eth.cpp --- a/eth/eth.cpp Mon May 01 18:20:55 2017 +0000 +++ b/eth/eth.cpp Fri May 05 17:44:16 2017 +0000 @@ -20,56 +20,29 @@ uint16_t typ; }; -static void typeToString(uint16_t type, int size, char* text) +uint16_t EthProtocol; + +void EthProtocolToString(uint16_t prototype, int size, char* text) { - switch (type) + switch (prototype) { case ARP: strncpy (text, "ARP" , size); break; case IPV4: strncpy (text, "IPV4", size); break; case IPV6: strncpy (text, "IPV6", size); break; - default: snprintf(text, size, "%04hX", type); break; + default: snprintf(text, size, "%04hX", prototype); break; } } -static void finalisePacket(int action, int type, int dataLength, void* pPacket, int* pSize) +static void finalisePacket(int action, int dataLength, void* pPacket, int* pSize) { + if (!action) return; + struct header * pHeader = (header*)pPacket; - - if (!action) return; + + MacMake(action, EthProtocol, pHeader->dst); - switch (action) - { - case DO_NOTHING: - return; - case UNICAST: - case UNICAST_DNS: - case UNICAST_DHCP: - break; - case MULTICAST_NODE: - if (type == IPV6) MacMakeMulticastNode6(pHeader->dst); - else MacMakeMulticastNode4(pHeader->dst); - break; - case MULTICAST_ROUTER: - if (type == IPV6) MacMakeMulticastRouter6(pHeader->dst); - else MacMakeMulticastRouter4(pHeader->dst); - break; - case MULTICAST_MDNS: - if (type == IPV6) MacMakeMulticastMdns6(pHeader->dst); - else MacMakeMulticastMdns4(pHeader->dst); - break; - case MULTICAST_LLMNR: - if (type == IPV6) MacMakeMulticastLlmnr6(pHeader->dst); - else MacMakeMulticastLlmnr4(pHeader->dst); - break; - case BROADCAST: - MacMakeBroadcast(pHeader->dst); - break; - default: - LogTimeF("Unknown ETH action %d\r\n", action); - return; - } memcpy(pHeader->src, MacLocal, 6); //Put our MAC into the source - pHeader->typ = NetToHost16(type); + pHeader->typ = NetToHost16(EthProtocol); *pSize = HEADER_SIZE + dataLength; } @@ -77,11 +50,11 @@ { char text[20]; LogTimeF("ETH %s\r\n", title); - NetMacToString(pHeader->dst, sizeof(text), text); + MacToString(pHeader->dst, sizeof(text), text); LogTimeF("Destination: %s\r\n", text); - NetMacToString(pHeader->src, sizeof(text), text); + MacToString(pHeader->src, sizeof(text), text); LogTimeF("Source: %s\r\n", text); - typeToString(NetToHost16(pHeader->typ), sizeof(text), text); + EthProtocolToString(NetToHost16(pHeader->typ), sizeof(text), text); LogTimeF("EtherType: %s\r\n", text); } int EthHandlePacket(void* pPacket, int* pSize) @@ -89,23 +62,16 @@ struct header * pHeader = (header*)pPacket; int dataLength = *pSize - HEADER_SIZE; void* pData = (char*)pPacket + HEADER_SIZE; - - bool doIt = MacCompareUnicastLocal (pHeader->dst) || MacCompareBroadcast (pHeader->dst) || - MacCompareMulticastLocal4 (pHeader->dst) || MacCompareMulticastLocal6 (pHeader->dst) || - MacCompareMulticastAllNodes4 (pHeader->dst) || MacCompareMulticastAllNodes6 (pHeader->dst) || - MacCompareMulticastAllRouters4(pHeader->dst) || MacCompareMulticastAllRouters6(pHeader->dst) || - MacCompareMulticastMdns4 (pHeader->dst) || MacCompareMulticastMdns6 (pHeader->dst) || - MacCompareMulticastLlmnr4 (pHeader->dst) || MacCompareMulticastLlmnr6 (pHeader->dst); - - if (!doIt) return DO_NOTHING; + + if (!MacAccept(pHeader->dst)) return DO_NOTHING; if (DEBUG) LogHeader(pHeader, "received packet"); - uint16_t type = NetToHost16(pHeader->typ); - if (type < 1500) return DO_NOTHING; //drop 802.3 messages + EthProtocol = NetToHost16(pHeader->typ); + if (EthProtocol < 1500) return DO_NOTHING; //drop 802.3 messages int action = DO_NOTHING; - switch (type) + switch (EthProtocol) { case ARP: action = ArpHandleReceivedPacket(pHeader->src, pData, &dataLength, pHeader->dst); break; case IPV4: action = Ip4HandleReceivedPacket(pHeader->src, pData, &dataLength, pHeader->dst); break; @@ -115,7 +81,7 @@ break; } - finalisePacket(action, type, dataLength, pPacket, pSize); + finalisePacket(action, dataLength, pPacket, pSize); return action; } int EthPollForPacketToSend(void* pPacket, int* pSize) @@ -124,22 +90,22 @@ void* pData = (char*)pPacket + HEADER_SIZE; int dataLength = 0; - int type = 0; + EthProtocol = 0; int action = DO_NOTHING; if (action == DO_NOTHING) { action = Ip6PollForPacketToSend(pData, &dataLength, pHeader->dst); - type = IPV6; + EthProtocol = IPV6; } if (action == DO_NOTHING) { action = Ip4PollForPacketToSend(pData, &dataLength, pHeader->dst); - type = IPV4; + EthProtocol = IPV4; } - finalisePacket(action, type, dataLength, pPacket, pSize); + finalisePacket(action, dataLength, pPacket, pSize); if (DEBUG) LogHeader(pHeader, "sent packet");