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

Committer:
andrewboyson
Date:
Tue Nov 14 17:43:08 2017 +0000
Revision:
56:35117a8b5c65
Parent:
52:fbc5a46b5e16
Child:
57:e0fb648acf48
Corrected closing FIN requirement

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 37:793b39683406 1 #include "mbed.h"
andrewboyson 37:793b39683406 2 #include "io.h"
andrewboyson 37:793b39683406 3 #include "log.h"
andrewboyson 37:793b39683406 4 #include "eth.h"
andrewboyson 37:793b39683406 5 #include "action.h"
andrewboyson 37:793b39683406 6 #include "mac.h"
andrewboyson 37:793b39683406 7 #include "net.h"
andrewboyson 37:793b39683406 8 #include "phy.h"
andrewboyson 0:faa09bd4e6bf 9
andrewboyson 0:faa09bd4e6bf 10 Ethernet eth;
andrewboyson 0:faa09bd4e6bf 11
andrewboyson 2:849103b5a16d 12 DigitalIn phyLinkNeg (P1_25);
andrewboyson 2:849103b5a16d 13 DigitalIn phySpeedNeg(P1_26);
andrewboyson 0:faa09bd4e6bf 14
andrewboyson 13:9cd54f7db57a 15 static char buf[1600];
andrewboyson 0:faa09bd4e6bf 16
andrewboyson 0:faa09bd4e6bf 17 static Timer blinkTimer;
andrewboyson 0:faa09bd4e6bf 18
andrewboyson 37:793b39683406 19 bool PhyTrace = false;
andrewboyson 37:793b39683406 20
andrewboyson 0:faa09bd4e6bf 21 static void blink()
andrewboyson 0:faa09bd4e6bf 22 {
andrewboyson 0:faa09bd4e6bf 23 blinkTimer.reset();
andrewboyson 0:faa09bd4e6bf 24 blinkTimer.start();
andrewboyson 0:faa09bd4e6bf 25 }
andrewboyson 0:faa09bd4e6bf 26
andrewboyson 0:faa09bd4e6bf 27 static void updateLeds()
andrewboyson 0:faa09bd4e6bf 28 {
andrewboyson 0:faa09bd4e6bf 29 if (blinkTimer.read_ms() < 100)
andrewboyson 0:faa09bd4e6bf 30 {
andrewboyson 0:faa09bd4e6bf 31 IoEthLedGrL = 0;
andrewboyson 0:faa09bd4e6bf 32 IoEthLedYeR = 0;
andrewboyson 0:faa09bd4e6bf 33 }
andrewboyson 0:faa09bd4e6bf 34 else
andrewboyson 0:faa09bd4e6bf 35 {
andrewboyson 2:849103b5a16d 36 IoEthLedGrL = !phyLinkNeg ;
andrewboyson 2:849103b5a16d 37 IoEthLedYeR = !phySpeedNeg;
andrewboyson 0:faa09bd4e6bf 38 blinkTimer.stop();
andrewboyson 0:faa09bd4e6bf 39 }
andrewboyson 0:faa09bd4e6bf 40 }
andrewboyson 0:faa09bd4e6bf 41 static int readPacket()
andrewboyson 0:faa09bd4e6bf 42 {
andrewboyson 0:faa09bd4e6bf 43 int sizeReceived = eth.receive();
andrewboyson 2:849103b5a16d 44 if (sizeReceived)
andrewboyson 2:849103b5a16d 45 {
andrewboyson 2:849103b5a16d 46 eth.read(buf, sizeReceived);
andrewboyson 2:849103b5a16d 47 blink();
andrewboyson 2:849103b5a16d 48 }
andrewboyson 0:faa09bd4e6bf 49 return sizeReceived;
andrewboyson 0:faa09bd4e6bf 50 }
andrewboyson 0:faa09bd4e6bf 51
andrewboyson 0:faa09bd4e6bf 52 static void sendPacket(int sendLength)
andrewboyson 0:faa09bd4e6bf 53 {
andrewboyson 0:faa09bd4e6bf 54 eth.write(buf, sendLength); //Make a packet from the header (14 bytes) and the payload
andrewboyson 2:849103b5a16d 55 int sent = eth.send(); //Send the packet
andrewboyson 2:849103b5a16d 56 if (sent) blink();
andrewboyson 4:31fa7d50722c 57 else LogTimeF("Packet of %d bytes not sent\r\n", sendLength);
andrewboyson 0:faa09bd4e6bf 58 }
andrewboyson 0:faa09bd4e6bf 59
andrewboyson 2:849103b5a16d 60 static bool linkIsUp = false;
andrewboyson 2:849103b5a16d 61 static void checkLinkIsUp()
andrewboyson 2:849103b5a16d 62 {
andrewboyson 2:849103b5a16d 63 static Timer linkUpTimer;
andrewboyson 2:849103b5a16d 64 if (phyLinkNeg) //link is indicated as being down
andrewboyson 2:849103b5a16d 65 {
andrewboyson 2:849103b5a16d 66 linkIsUp = false;
andrewboyson 2:849103b5a16d 67 linkUpTimer.reset();
andrewboyson 2:849103b5a16d 68 linkUpTimer.start();
andrewboyson 2:849103b5a16d 69 }
andrewboyson 2:849103b5a16d 70 else //link is indicated as being up
andrewboyson 2:849103b5a16d 71 {
andrewboyson 2:849103b5a16d 72 if (linkUpTimer.read_ms() > 100)
andrewboyson 2:849103b5a16d 73 {
andrewboyson 2:849103b5a16d 74 linkIsUp = true;
andrewboyson 2:849103b5a16d 75 linkUpTimer.stop();
andrewboyson 2:849103b5a16d 76 }
andrewboyson 2:849103b5a16d 77 else
andrewboyson 2:849103b5a16d 78 {
andrewboyson 2:849103b5a16d 79 linkUpTimer.start();
andrewboyson 2:849103b5a16d 80 }
andrewboyson 2:849103b5a16d 81 }
andrewboyson 2:849103b5a16d 82 }
andrewboyson 37:793b39683406 83 static void logHeader()
andrewboyson 37:793b39683406 84 {
andrewboyson 37:793b39683406 85 }
andrewboyson 2:849103b5a16d 86 void PhyMain()
andrewboyson 0:faa09bd4e6bf 87 {
andrewboyson 0:faa09bd4e6bf 88 updateLeds();
andrewboyson 0:faa09bd4e6bf 89
andrewboyson 2:849103b5a16d 90 checkLinkIsUp();
andrewboyson 2:849103b5a16d 91
andrewboyson 7:b794780e33b4 92 int size = readPacket();
andrewboyson 13:9cd54f7db57a 93
andrewboyson 9:91dae5300a4d 94 int action = DO_NOTHING;
andrewboyson 0:faa09bd4e6bf 95
andrewboyson 0:faa09bd4e6bf 96 //If a packet has been received then handle it
andrewboyson 37:793b39683406 97 if (size) action = EthHandlePacket(logHeader, &buf, &size);
andrewboyson 0:faa09bd4e6bf 98
andrewboyson 0:faa09bd4e6bf 99 //If there is no packet to handle then see if there is a packet waiting to be sent
andrewboyson 9:91dae5300a4d 100 if (action == DO_NOTHING && linkIsUp)
andrewboyson 2:849103b5a16d 101 {
andrewboyson 10:f0854784e960 102 action = EthPollForPacketToSend(&buf, &size);
andrewboyson 2:849103b5a16d 103 }
andrewboyson 0:faa09bd4e6bf 104
andrewboyson 0:faa09bd4e6bf 105 //If there is a packet to send then send it
andrewboyson 13:9cd54f7db57a 106 if (action != DO_NOTHING)
andrewboyson 13:9cd54f7db57a 107 {
andrewboyson 13:9cd54f7db57a 108 sendPacket(size);
andrewboyson 13:9cd54f7db57a 109 }
andrewboyson 0:faa09bd4e6bf 110 }
andrewboyson 0:faa09bd4e6bf 111
andrewboyson 2:849103b5a16d 112 void PhyInit()
andrewboyson 0:faa09bd4e6bf 113 {
andrewboyson 2:849103b5a16d 114 phyLinkNeg.mode(PullUp);
andrewboyson 2:849103b5a16d 115 phySpeedNeg.mode(PullUp);
andrewboyson 0:faa09bd4e6bf 116 blink();
andrewboyson 13:9cd54f7db57a 117 eth.address(MacLocal);
andrewboyson 37:793b39683406 118 if (PhyTrace)
andrewboyson 37:793b39683406 119 {
andrewboyson 47:73af5c0b0dc2 120 Log("\r\n");
andrewboyson 47:73af5c0b0dc2 121 LogTime("MAC: ");
andrewboyson 47:73af5c0b0dc2 122 MacLog(MacLocal);
andrewboyson 47:73af5c0b0dc2 123 Log("\r\n");
andrewboyson 37:793b39683406 124 }
andrewboyson 0:faa09bd4e6bf 125 }