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
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
Generated on Tue Jul 12 2022 18:53:40 by 1.7.2