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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers udptcp6.c Source File

udptcp6.c

00001 #include <stdint.h>
00002 #include <string.h>
00003 
00004 #include     "log.h"
00005 #include     "net.h"
00006 #include  "action.h"
00007 #include     "eth.h"
00008 #include    "dhcp.h"
00009 #include      "ns.h"
00010 #include      "ip.h"
00011 #include "ip6addr.h"
00012 #include   "slaac.h"
00013 #include     "tcp.h"
00014 #include "tcprecv.h"
00015 #include "tcpsend.h"
00016 #include  "tcphdr.h"
00017 #include     "udp.h"
00018 #include     "led.h"
00019 #include     "ar6.h"
00020 #include "checksum.h"
00021 
00022 static uint16_t calculateChecksum(uint8_t pro, char* pSrcIp, char* pDstIp, int size, void* pPacket)
00023 {   
00024     uint32_t sum = 0;
00025     uint16_t pro16 = pro;
00026      sum = CheckSumAddDirect(sum,   16, pSrcIp );
00027      sum = CheckSumAddDirect(sum,   16, pDstIp );
00028      sum = CheckSumAddInvert(sum,    2, &pro16 );
00029      sum = CheckSumAddInvert(sum,    2, &size  );
00030     return CheckSumFinDirect(sum, size, pPacket);
00031 }
00032 static void finalisePacket(uint8_t pro, int action, int scope, void* pPacket, int size, char* pSrcIp, char* pDstIp)
00033 {    
00034     if (!action) return;
00035     
00036       Ip6AddrFromDest    (ActionGetDestPart(action), pDstIp);
00037     SlaacAddressFromScope(scope,                     pSrcIp);
00038         
00039     switch (pro)
00040     {
00041         case TCP: TcpHdrWriteToPacket(pPacket); break;
00042         case UDP: UdpMakeHeader(size, pPacket); break;
00043     }
00044     
00045     uint16_t checksum = calculateChecksum(pro, pSrcIp, pDstIp, size, pPacket);
00046     
00047     switch (pro)
00048     {
00049         case TCP: TcpHdrSetChecksum(pPacket, checksum); break;
00050         case UDP: UdpHdrSetChecksum(pPacket, checksum); break;
00051     }
00052     
00053     if (ActionGetTracePart(action))
00054     {
00055         switch (pro)
00056         {
00057             case TCP: TcpHdrLog(0); break;
00058             case UDP: UdpLogHeader(0); break;
00059         }
00060     }
00061 }
00062 static void (*pTraceBack)(void);
00063 static int tracePacketProtocol;
00064 static uint16_t calculatedChecksum;
00065 static void trace()
00066 {
00067     pTraceBack();
00068     switch(tracePacketProtocol)
00069     {
00070         case UDP: UdpLogHeader(calculatedChecksum); break;
00071         case TCP: TcpHdrLog(calculatedChecksum); break;
00072         default: LogTimeF("UdpTcp6 - traceback unrecognised protocol %d\r\n", tracePacketProtocol); break;
00073     }
00074 }
00075 
00076 int Tcp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp, int remArIndex)
00077 {
00078     pTraceBack = traceback;
00079     tracePacketProtocol = TCP;
00080     calculatedChecksum = calculateChecksum(TCP, pSrcIp, pDstIp, sizeRx, pPacketRx);
00081     
00082     int action = TcpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx, ETH_IPV6, remArIndex, scope);
00083     
00084     Ip6AddrCopy(pDstIp, pSrcIp);
00085     
00086     finalisePacket(TCP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp);
00087         
00088     return action;
00089 }
00090 
00091 int Udp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp)
00092 {
00093     pTraceBack = traceback;
00094     tracePacketProtocol = UDP;
00095     calculatedChecksum = calculateChecksum(UDP, pSrcIp, pDstIp, sizeRx, pPacketRx);
00096         
00097     int action = UdpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx);
00098         
00099     Ip6AddrCopy(pDstIp, pSrcIp);
00100     
00101     finalisePacket(UDP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp);
00102         
00103     return action;
00104 }
00105 int Tcp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
00106 {
00107     int remArIndex = -1;
00108     int locIpScope = SCOPE_LINK_LOCAL;
00109     int action = TcpPollForPacketToSend(pSize, pPacket, ETH_IPV6, &remArIndex, &locIpScope);
00110     if (action && remArIndex >= 0) Ar6IndexToIp(remArIndex, pDstIp);
00111     
00112 
00113     finalisePacket(TCP, action, locIpScope, pPacket, *pSize, pSrcIp, pDstIp);
00114                 
00115     return action;
00116 
00117 }
00118 int Udp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp)
00119 {        
00120     int action = UdpPollForPacketToSend(ETH_IPV6, pSize, pPacket);
00121     
00122     int scope = SCOPE_LINK_LOCAL;
00123 
00124     finalisePacket(UDP, action, scope, pPacket, *pSize, pSrcIp, pDstIp);
00125                 
00126     return action;
00127 
00128 }
00129