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
ip6/udptcp6.c@151:bde6f7da1755, 2019-07-19 (annotated)
- Committer:
- andrewboyson
- Date:
- Fri Jul 19 17:48:06 2019 +0000
- Revision:
- 151:bde6f7da1755
- Parent:
- 138:5ff0c7069300
- Child:
- 172:9bc3c7b2cca1
Removed private key and certificate from semihost storage as found to be unreliable (though secure) and moved it into flash storage (reliable, simple, but visible on mbed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 61:aad055f1b0d1 | 1 | #include <stdint.h> |
andrewboyson | 61:aad055f1b0d1 | 2 | #include <string.h> |
andrewboyson | 61:aad055f1b0d1 | 3 | |
andrewboyson | 74:c3756bfa960e | 4 | #include "log.h" |
andrewboyson | 74:c3756bfa960e | 5 | #include "net.h" |
andrewboyson | 74:c3756bfa960e | 6 | #include "action.h" |
andrewboyson | 74:c3756bfa960e | 7 | #include "eth.h" |
andrewboyson | 74:c3756bfa960e | 8 | #include "dhcp.h" |
andrewboyson | 74:c3756bfa960e | 9 | #include "ns.h" |
andrewboyson | 74:c3756bfa960e | 10 | #include "ip.h" |
andrewboyson | 49:1a6336f2b3f9 | 11 | #include "ip6addr.h" |
andrewboyson | 74:c3756bfa960e | 12 | #include "slaac.h" |
andrewboyson | 74:c3756bfa960e | 13 | #include "tcp.h" |
andrewboyson | 74:c3756bfa960e | 14 | #include "tcprecv.h" |
andrewboyson | 74:c3756bfa960e | 15 | #include "tcpsend.h" |
andrewboyson | 74:c3756bfa960e | 16 | #include "tcphdr.h" |
andrewboyson | 74:c3756bfa960e | 17 | #include "udp.h" |
andrewboyson | 74:c3756bfa960e | 18 | #include "led.h" |
andrewboyson | 74:c3756bfa960e | 19 | #include "ar6.h" |
andrewboyson | 136:8a65abb0dc63 | 20 | #include "checksum.h" |
andrewboyson | 11:c051adb70c5a | 21 | |
andrewboyson | 11:c051adb70c5a | 22 | static uint16_t calculateChecksum(uint8_t pro, char* pSrcIp, char* pDstIp, int size, void* pPacket) |
andrewboyson | 136:8a65abb0dc63 | 23 | { |
andrewboyson | 136:8a65abb0dc63 | 24 | uint32_t sum = 0; |
andrewboyson | 136:8a65abb0dc63 | 25 | uint16_t pro16 = pro; |
andrewboyson | 136:8a65abb0dc63 | 26 | sum = CheckSumAddDirect(sum, 16, pSrcIp ); |
andrewboyson | 136:8a65abb0dc63 | 27 | sum = CheckSumAddDirect(sum, 16, pDstIp ); |
andrewboyson | 136:8a65abb0dc63 | 28 | sum = CheckSumAddInvert(sum, 2, &pro16 ); |
andrewboyson | 136:8a65abb0dc63 | 29 | sum = CheckSumAddInvert(sum, 2, &size ); |
andrewboyson | 136:8a65abb0dc63 | 30 | return CheckSumFinDirect(sum, size, pPacket); |
andrewboyson | 11:c051adb70c5a | 31 | } |
andrewboyson | 44:83ce5ace337b | 32 | static void finalisePacket(uint8_t pro, int action, int scope, void* pPacket, int size, char* pSrcIp, char* pDstIp) |
andrewboyson | 11:c051adb70c5a | 33 | { |
andrewboyson | 11:c051adb70c5a | 34 | if (!action) return; |
andrewboyson | 11:c051adb70c5a | 35 | |
andrewboyson | 49:1a6336f2b3f9 | 36 | Ip6AddressFromDest (ActionGetDestPart(action), pDstIp); |
andrewboyson | 49:1a6336f2b3f9 | 37 | SlaacAddressFromScope(scope, pSrcIp); |
andrewboyson | 44:83ce5ace337b | 38 | |
andrewboyson | 11:c051adb70c5a | 39 | switch (pro) |
andrewboyson | 11:c051adb70c5a | 40 | { |
andrewboyson | 74:c3756bfa960e | 41 | case TCP: TcpHdrWriteToPacket(pPacket); break; |
andrewboyson | 11:c051adb70c5a | 42 | case UDP: UdpMakeHeader(size, pPacket); break; |
andrewboyson | 11:c051adb70c5a | 43 | } |
andrewboyson | 61:aad055f1b0d1 | 44 | |
andrewboyson | 11:c051adb70c5a | 45 | uint16_t checksum = calculateChecksum(pro, pSrcIp, pDstIp, size, pPacket); |
andrewboyson | 11:c051adb70c5a | 46 | |
andrewboyson | 11:c051adb70c5a | 47 | switch (pro) |
andrewboyson | 11:c051adb70c5a | 48 | { |
andrewboyson | 137:cf6e7db0e985 | 49 | case TCP: TcpHdrSetChecksum(pPacket, checksum); break; |
andrewboyson | 138:5ff0c7069300 | 50 | case UDP: UdpHdrSetChecksum(pPacket, checksum); break; |
andrewboyson | 11:c051adb70c5a | 51 | } |
andrewboyson | 11:c051adb70c5a | 52 | |
andrewboyson | 37:793b39683406 | 53 | if (ActionGetTracePart(action)) |
andrewboyson | 11:c051adb70c5a | 54 | { |
andrewboyson | 37:793b39683406 | 55 | switch (pro) |
andrewboyson | 37:793b39683406 | 56 | { |
andrewboyson | 73:43e3d7fb3d60 | 57 | case TCP: TcpHdrLog(0); break; |
andrewboyson | 56:35117a8b5c65 | 58 | case UDP: UdpLogHeader(0); break; |
andrewboyson | 37:793b39683406 | 59 | } |
andrewboyson | 37:793b39683406 | 60 | } |
andrewboyson | 37:793b39683406 | 61 | } |
andrewboyson | 37:793b39683406 | 62 | static void (*pTraceBack)(void); |
andrewboyson | 37:793b39683406 | 63 | static int tracePacketProtocol; |
andrewboyson | 37:793b39683406 | 64 | static uint16_t calculatedChecksum; |
andrewboyson | 37:793b39683406 | 65 | static void trace() |
andrewboyson | 37:793b39683406 | 66 | { |
andrewboyson | 37:793b39683406 | 67 | pTraceBack(); |
andrewboyson | 37:793b39683406 | 68 | switch(tracePacketProtocol) |
andrewboyson | 37:793b39683406 | 69 | { |
andrewboyson | 56:35117a8b5c65 | 70 | case UDP: UdpLogHeader(calculatedChecksum); break; |
andrewboyson | 73:43e3d7fb3d60 | 71 | case TCP: TcpHdrLog(calculatedChecksum); break; |
andrewboyson | 37:793b39683406 | 72 | default: LogTimeF("UdpTcp6 - traceback unrecognised protocol %d\r\n", tracePacketProtocol); break; |
andrewboyson | 11:c051adb70c5a | 73 | } |
andrewboyson | 11:c051adb70c5a | 74 | } |
andrewboyson | 11:c051adb70c5a | 75 | |
andrewboyson | 74:c3756bfa960e | 76 | int Tcp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp, int remArIndex) |
andrewboyson | 11:c051adb70c5a | 77 | { |
andrewboyson | 37:793b39683406 | 78 | pTraceBack = traceback; |
andrewboyson | 37:793b39683406 | 79 | tracePacketProtocol = TCP; |
andrewboyson | 59:e0e556c8bd46 | 80 | calculatedChecksum = calculateChecksum(TCP, pSrcIp, pDstIp, sizeRx, pPacketRx); |
andrewboyson | 11:c051adb70c5a | 81 | |
andrewboyson | 80:4ef1500fca1d | 82 | int action = TcpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx, IPV6, remArIndex, scope); |
andrewboyson | 11:c051adb70c5a | 83 | |
andrewboyson | 49:1a6336f2b3f9 | 84 | Ip6AddressCopy(pDstIp, pSrcIp); |
andrewboyson | 11:c051adb70c5a | 85 | |
andrewboyson | 59:e0e556c8bd46 | 86 | finalisePacket(TCP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp); |
andrewboyson | 11:c051adb70c5a | 87 | |
andrewboyson | 11:c051adb70c5a | 88 | return action; |
andrewboyson | 11:c051adb70c5a | 89 | } |
andrewboyson | 11:c051adb70c5a | 90 | |
andrewboyson | 59:e0e556c8bd46 | 91 | int Udp6HandleReceivedPacket(void (*traceback)(void), int scope, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx, char* pSrcIp, char* pDstIp) |
andrewboyson | 11:c051adb70c5a | 92 | { |
andrewboyson | 37:793b39683406 | 93 | pTraceBack = traceback; |
andrewboyson | 37:793b39683406 | 94 | tracePacketProtocol = UDP; |
andrewboyson | 59:e0e556c8bd46 | 95 | calculatedChecksum = calculateChecksum(UDP, pSrcIp, pDstIp, sizeRx, pPacketRx); |
andrewboyson | 59:e0e556c8bd46 | 96 | |
andrewboyson | 59:e0e556c8bd46 | 97 | int action = UdpHandleReceivedPacket(trace, sizeRx, pPacketRx, pSizeTx, pPacketTx); |
andrewboyson | 44:83ce5ace337b | 98 | |
andrewboyson | 49:1a6336f2b3f9 | 99 | Ip6AddressCopy(pDstIp, pSrcIp); |
andrewboyson | 11:c051adb70c5a | 100 | |
andrewboyson | 59:e0e556c8bd46 | 101 | finalisePacket(UDP, action, scope, pPacketTx, *pSizeTx, pSrcIp, pDstIp); |
andrewboyson | 11:c051adb70c5a | 102 | |
andrewboyson | 11:c051adb70c5a | 103 | return action; |
andrewboyson | 11:c051adb70c5a | 104 | } |
andrewboyson | 71:736a5747ade1 | 105 | int Tcp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp) |
andrewboyson | 74:c3756bfa960e | 106 | { |
andrewboyson | 74:c3756bfa960e | 107 | int remArIndex = -1; |
andrewboyson | 80:4ef1500fca1d | 108 | int locIpScope = SCOPE_LOCAL; |
andrewboyson | 80:4ef1500fca1d | 109 | int action = TcpPollForPacketToSend(pSize, pPacket, IPV6, &remArIndex, &locIpScope); |
andrewboyson | 74:c3756bfa960e | 110 | if (action && remArIndex >= 0) Ar6IndexToIp(remArIndex, pDstIp); |
andrewboyson | 71:736a5747ade1 | 111 | |
andrewboyson | 71:736a5747ade1 | 112 | |
andrewboyson | 80:4ef1500fca1d | 113 | finalisePacket(TCP, action, locIpScope, pPacket, *pSize, pSrcIp, pDstIp); |
andrewboyson | 71:736a5747ade1 | 114 | |
andrewboyson | 71:736a5747ade1 | 115 | return action; |
andrewboyson | 71:736a5747ade1 | 116 | |
andrewboyson | 71:736a5747ade1 | 117 | } |
andrewboyson | 11:c051adb70c5a | 118 | int Udp6PollForPacketToSend(void* pPacket, int* pSize, char* pSrcIp, char* pDstIp) |
andrewboyson | 11:c051adb70c5a | 119 | { |
andrewboyson | 11:c051adb70c5a | 120 | int action = UdpPollForPacketToSend(IPV6, pSize, pPacket); |
andrewboyson | 11:c051adb70c5a | 121 | |
andrewboyson | 44:83ce5ace337b | 122 | int scope = SCOPE_LOCAL; |
andrewboyson | 44:83ce5ace337b | 123 | |
andrewboyson | 44:83ce5ace337b | 124 | finalisePacket(UDP, action, scope, pPacket, *pSize, pSrcIp, pDstIp); |
andrewboyson | 11:c051adb70c5a | 125 | |
andrewboyson | 11:c051adb70c5a | 126 | return action; |
andrewboyson | 11:c051adb70c5a | 127 | |
andrewboyson | 11:c051adb70c5a | 128 | } |
andrewboyson | 11:c051adb70c5a | 129 |