📄 tcpip.h
字号:
TCP_SYN_ACK_FRAME, TCP_FIN_FRAME, TCP_DATA_FRAME} TLastFrameSent;// constants#ifdef extern // Keil: declarations for modular programmingconst uint16_t MyIP[] = // "MYIP1.MYIP2.MYIP3.MYIP4"{ MYIP_1 + (MYIP_2 << 8), // use 'unsigned int' to MYIP_3 + (MYIP_4 << 8) // achieve word alignment};const uint16_t SubnetMask[] = // "SUBMASK1.SUBMASK2.SUBMASK3.SUBMASK4"{ SUBMASK_1 + (SUBMASK_2 << 8), // use 'unsigned int' to SUBMASK_3 + (SUBMASK_4 << 8) // achieve word alignment};const uint16_t GatewayIP[] = // "GWIP1.GWIP2.GWIP3.GWIP4"{ GWIP_1 + (GWIP_2 << 8), // use 'unsigned int' to GWIP_3 + (GWIP_4 << 8) // achieve word alignment};#elseextern const uint16_t MyIP[2]; // "MYIP1.MYIP2.MYIP3.MYIP4"extern const uint16_t SubnetMask[2]; // "SUBMASK1.SUBMASK2.SUBMASK3.SUBMASK4"extern const uint16_t GatewayIP[2]; // "GWIP1.GWIP2.GWIP3.GWIP4"extern const uint8_t MyMAC[6]; // "M1-M2-M3-M4-M5-M6"#endif// easyWEB's internal variablesextern TTCPStateMachine TCPStateMachine; // perhaps the most important var at all ;-)extern TLastFrameSent LastFrameSent; // retransmission typeextern uint16_t ISNGenHigh; // upper word of our Initial Sequence Numberextern unsigned long TCPSeqNr; // next sequence number to sendextern unsigned long TCPUNASeqNr; // last unaknowledged sequence number // incremented AFTER sending dataextern unsigned long TCPAckNr; // next seq to receive and ack to send // incremented AFTER receiving dataextern uint8_t TCPTimer; // inc'd each 262msextern uint8_t RetryCounter; // nr. of retransmissions// properties of the just received frameextern uint16_t RecdFrameLength; // EMAC reported frame lengthextern uint16_t RecdFrameMAC[3]; // 48 bit MACextern uint16_t RecdFrameIP[2]; // 32 bit IPextern uint16_t RecdIPFrameLength; // 16 bit IP packet length// the next 3 buffers must be word-aligned!// (here the 'RecdIPFrameLength' above does that)#if defined ( __CC_ARM )extern uint16_t __align(4) _TxFrame1[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + MAX_TCP_TX_DATA_SIZE)/2];extern uint16_t __align(4) _TxFrame2[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE)/2];extern uint16_t __align(4) _RxTCPBuffer[MAX_TCP_RX_DATA_SIZE/2]; // space for incoming TCP-data#elif defined ( __ICCARM__ )#pragma data_alignment=4extern uint16_t _TxFrame1[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + MAX_TCP_TX_DATA_SIZE)/2];#pragma data_alignment=4extern uint16_t _TxFrame2[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE)/2];#pragma data_alignment=4extern uint16_t _RxTCPBuffer[MAX_TCP_RX_DATA_SIZE/2]; // space for incoming TCP-data#elif defined ( __GNUC__ )extern uint16_t __attribute__ ((aligned (4))) _TxFrame1[(ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE + MAX_TCP_TX_DATA_SIZE)/2];extern uint16_t __attribute__ ((aligned (4))) _TxFrame2[(ETH_HEADER_SIZE + MAX_ETH_TX_DATA_SIZE)/2];extern uint16_t __attribute__ ((aligned (4))) _RxTCPBuffer[MAX_TCP_RX_DATA_SIZE/2]; // space for incoming TCP-data#endif#define TxFrame1 ((uint8_t *)_TxFrame1)#define TxFrame2 ((uint8_t *)_TxFrame2)#define RxTCPBuffer ((uint8_t *)_RxTCPBuffer)extern uint16_t TxFrame1Size; // bytes to send in TxFrame1extern uint8_t TxFrame2Size; // bytes to send in TxFrame2extern uint8_t TransmitControl;#define SEND_FRAME1 0x01#define SEND_FRAME2 0x02extern uint8_t TCPFlags;#define TCP_ACTIVE_OPEN 0x01 // easyWEB shall initiate a connection#define IP_ADDR_RESOLVED 0x02 // IP sucessfully resolved to MAC#define TCP_TIMER_RUNNING 0x04#define TIMER_TYPE_RETRY 0x08#define TCP_CLOSE_REQUESTED 0x10// prototypesvoid DoNetworkStuff(void);// Handlers for incoming framesvoid ProcessEthBroadcastFrame(void);void ProcessEthIAFrame(void);void ProcessICMPFrame(void);void ProcessTCPFrame(void);// fill TX-buffersvoid PrepareARP_REQUEST(void);void PrepareARP_ANSWER(void);void PrepareICMP_ECHO_REPLY(void);void PrepareTCP_FRAME(uint16_t TCPCode);void PrepareTCP_DATA_FRAME(void);// general help functionsvoid SendFrame1(void);void SendFrame2(void);void TCPStartRetryTimer(void);void TCPStartTimeWaitTimer(void);void TCPRestartTimer(void);void TCPStopTimer(void);void TCPHandleRetransmission(void);void TCPHandleTimeout(void);uint16_t CalcChecksum(void *Start, uint16_t Count, uint8_t IsTCP);// functions to work with big-endian numbersuint16_t SwapBytes(uint16_t Data);void WriteWBE(uint8_t *Add, uint16_t Data);void WriteDWBE(uint8_t *Add, unsigned long Data);// easyWEB-API functionsvoid TCPLowLevelInit(void); // setup timer, LAN-controller, flags...void TCPPassiveOpen(void); // listen for a connectionvoid TCPActiveOpen(void); // open connectionvoid TCPClose(void); // close connectionvoid TCPReleaseRxBuffer(void); // indicate to discard rec'd packetvoid TCPTransmitTxBuffer(void); // initiate transfer after TxBuffer is filled#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
void TCPClockHandler(void) __irq ;
#else
void TCPClockHandler(void) ;
#endif// easyWEB-API global vars and flagsextern uint16_t TCPRxDataCount; // nr. of bytes rec'dextern uint16_t TCPTxDataCount; // nr. of bytes to sendextern uint16_t TCPLocalPort; // TCP portsextern uint16_t TCPRemotePort;extern uint16_t RemoteMAC[3]; // MAC and IP of current TCP-sessionextern uint16_t RemoteIP[2];extern uint8_t SocketStatus;#define SOCK_ACTIVE 0x01 // state machine NOT closed#define SOCK_CONNECTED 0x02 // user may send & receive data#define SOCK_DATA_AVAILABLE 0x04 // new data available#define SOCK_TX_BUF_RELEASED 0x08 // user may fill buffer#define SOCK_ERROR_MASK 0xF0 // bit-mask to check for errors#define SOCK_ERR_OK 0x00 // no error#define SOCK_ERR_ARP_TIMEOUT 0x10 // timeout waiting for an ARP-REPLY#define SOCK_ERR_TCP_TIMEOUT 0x20 // timeout waiting for an ACK#define SOCK_ERR_CONN_RESET 0x30 // connection was reset by the other TCP#define SOCK_ERR_REMOTE 0x40 // remote TCP caused fatal error#define SOCK_ERR_ETHERNET 0x50 // network interface error (timeout)// easyWEB-API buffer-pointers#define TCP_TX_BUF ((uint8_t *)TxFrame1 + ETH_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE)#define TCP_RX_BUF ((uint8_t *)RxTCPBuffer)#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -