ENC28J60 Ethernet gateway

This commit is contained in:
Henrik Ekblad
2015-09-13 23:51:10 +02:00
parent 76f208abe7
commit b66513affc
50 changed files with 206 additions and 255 deletions
+25 -8
View File
@@ -26,7 +26,7 @@
#include "MyConfig.h"
#if defined(MY_GATEWAY_SERIAL) || defined(MY_GATEWAY_W5100)
#if defined(MY_GATEWAY_SERIAL) || defined(MY_GATEWAY_W5100) || defined(MY_GATEWAY_ENC28J60)
#define MY_GATEWAY_FEATURE
#define MY_NODE_TYPE "gateway"
#elif defined(MY_REPEATER_FEATURE)
@@ -102,6 +102,13 @@
// We assume that a gateway having a radio also should act as repeater
#define MY_REPEATER_FEATURE
#endif
#if defined(MY_CONTROLLER_IP_ADDRESS)
#define MY_GATEWAY_CLIENT_MODE
#endif
#if !defined(MY_PORT)
#error You must define MY_PORT (cotroller or gatway port to open)
#endif
#if defined(MY_GATEWAY_W5100)
#include "drivers/AVR/Ethernet_W5100/utility/socket.cpp"
#include "drivers/AVR/Ethernet_W5100/utility/w5100.cpp"
@@ -110,13 +117,6 @@
#include "drivers/AVR/Ethernet_W5100/EthernetUdp.cpp"
#include "drivers/AVR/Ethernet_W5100/IPAddress.cpp"
#if defined(MY_CONTROLLER_IP_ADDRESS)
#define MY_GATEWAY_CLIENT_MODE
#endif
#if !defined(MY_PORT)
#error You must define MY_PORT (cotroller or gatway port to open)
#endif
#if !defined(USE_UDP)
#include "drivers/AVR/Ethernet_W5100/EthernetServer.cpp"
#endif
@@ -127,6 +127,23 @@
#else
// What do we do here?
#endif
#elif defined(MY_GATEWAY_ENC28J60)
#undef MY_USE_UDP // Will not fit (or compile) on ENC28J60
#include "drivers/AVR/Ethernet_UIP/src/utility/uipethernet-conf.h"
#include "drivers/AVR/Ethernet_UIP/src/utility/uip-conf.h"
#include "drivers/AVR/Ethernet_UIP/src/UIPEthernet.h"
#include "drivers/AVR/Ethernet_UIP/src/utility/Enc28J60Network.cpp"
#include "drivers/AVR/Ethernet_UIP/src/utility/mempool_conf.h"
#include "drivers/AVR/Ethernet_UIP/src/utility/mempool.cpp"
#include "drivers/AVR/Ethernet_UIP/src/UIPEthernet.cpp"
#include "drivers/AVR/Ethernet_UIP/src/UIPServer.cpp"
#include "drivers/AVR/Ethernet_UIP/src/UIPClient.cpp"
#include "drivers/AVR/Ethernet_UIP/src/utility/clock-arch.c"
#include "drivers/AVR/Ethernet_UIP/src/utility/uip_timer.c"
#include "drivers/AVR/Ethernet_UIP/src/utility/uip.c"
#include "drivers/AVR/Ethernet_UIP/src/utility/uip_arp.c"
#include "core/MyGatewayTransportEthernet.cpp"
#elif defined(MY_GATEWAY_SERIAL)
#include "core/MyGatewayTransportSerial.cpp"
#endif
-23
View File
@@ -1,23 +0,0 @@
/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*/
#include "MyProtocol.h"
MyProtocol::MyProtocol() {
}
@@ -1,4 +1,4 @@
This is UIPEthernet version 1.09
This is UIPEthernet version 1.59
An plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS.
Just include 'UIPEthernet.h' instead of 'Ethernet.h' and use all your code written for the stock Arduino Ethernet lib!
@@ -20,6 +20,7 @@
*/
#include <SPI.h>
#include <UIPEthernet.h>
// Enter a MAC address and IP address for your controller below.
@@ -18,6 +18,7 @@
* Adaption to Enc28J60 by Norbert Truchsess <norbert.truchsess@t-online.de>
*/
#include <SPI.h>
#include <UIPEthernet.h>
// The connection_data struct needs to be defined in an external file.
#include <UIPServer.h>
@@ -16,6 +16,7 @@
* Copyright (C) 2013 by Norbert Truchsess <norbert.truchsess@t-online.de>
*/
#include <SPI.h>
#include <UIPEthernet.h>
EthernetClient client;
@@ -18,6 +18,7 @@
* Adaption to Enc28J60 by Norbert Truchsess <norbert.truchsess@t-online.de>
*/
#include <SPI.h>
#include <UIPEthernet.h>
EthernetServer server = EthernetServer(1000);
@@ -16,6 +16,7 @@
* Copyright (C) 2013 by Norbert Truchsess (norbert.truchsess@t-online.de)
*/
#include <SPI.h>
#include <UIPEthernet.h>
EthernetUDP udp;
@@ -14,6 +14,7 @@
* Copyright (C) 2013 by Norbert Truchsess (norbert.truchsess@t-online.de)
*/
#include <SPI.h>
#include <UIPEthernet.h>
EthernetUDP udp;
@@ -4,7 +4,7 @@ email=Norbert Truchsess <norbert.truchsess@t-online.de>
sentence=Ethernet library for ENC28J60
paragraph=implements the same API as stock Ethernet-lib. Just replace the include of Ethernet.h with UIPEthernet.h
url=https://github.com/ntruchsess/arduino_uip
architectures=avr
version=1.04
architectures=*
version=1.50
dependencies=
core-dependencies=arduino (>=1.5.0)
@@ -5,7 +5,7 @@
#ifndef DNSClient_h
#define DNSClient_h
#include <UIPUdp.h>
#include "UIPUdp.h"
class DNSClient
{
@@ -25,8 +25,19 @@
#include "Enc28J60Network.h"
#include "Arduino.h"
#if ENC28J60_USE_SPILIB
#include <SPI.h>
#endif
extern "C" {
#include <avr/io.h>
#if defined(ARDUINO_ARCH_AVR)
// AVR-specific code
#include <avr/io.h>
#elif defined(ARDUINO_ARCH_SAM)
// SAM-specific code
#else
// generic, non-platform specific code
#endif
#include "enc28j60.h"
#include "uip.h"
}
@@ -40,7 +51,15 @@ extern "C" {
// set CS to 1 = passive
#define CSPASSIVE digitalWrite(ENC28J60_CONTROL_CS, HIGH)
//
#if defined(ARDUINO_ARCH_AVR)
#define waitspi() while(!(SPSR&(1<<SPIF)))
#elif defined(ARDUINO_ARCH_SAM)
#if ENC28J60_CONTROL_CS==BOARD_SPI_SS0 or ENC28J60_CONTROL_CS==BOARD_SPI_SS1 or ENC28J60_CONTROL_CS==BOARD_SPI_SS2 or ENC28J60_CONTROL_CS==BOARD_SPI_SS3
#define ENC28J60_USE_SPILIB_EXT 1
#endif
#endif
uint16_t Enc28J60Network::nextPacketPtr;
uint8_t Enc28J60Network::bank=0xff;
@@ -55,25 +74,34 @@ void Enc28J60Network::init(uint8_t* macaddr)
pinMode(ENC28J60_CONTROL_CS, OUTPUT);
CSPASSIVE; // ss=0
//
#if ENC28J60_USE_SPILIB
SPI.begin();
#if defined(ARDUINO_ARCH_AVR)
// AVR-specific code
SPI.setClockDivider(SPI_CLOCK_DIV2); //results in 8MHZ at 16MHZ system clock.
#elif defined(ARDUINO_ARCH_SAM)
// SAM-specific code
SPI.setClockDivider(10); //defaults to 21 which results in aprox. 4MHZ. A 10 should result in a little more than 8MHZ.
#else
// generic, non-platform specific code
#endif
#else
pinMode(SPI_MOSI, OUTPUT);
pinMode(SPI_SCK, OUTPUT);
pinMode(SPI_MISO, INPUT);
//Hardware SS must be configured as OUTPUT to enable SPI-master (regardless of which pin is configured as ENC28J60_CONTROL_CS)
pinMode(SPI_SS, OUTPUT);
digitalWrite(SPI_MOSI, LOW);
digitalWrite(SPI_SCK, LOW);
/*DDRB |= 1<<PB3 | 1<<PB5; // mosi, sck output
cbi(DDRB,PINB4); // MISO is input
//
cbi(PORTB,PB3); // MOSI low
cbi(PORTB,PB5); // SCK low
*/
//
// initialize SPI interface
// master mode and Fosc/2 clock:
SPCR = (1<<SPE)|(1<<MSTR);
SPSR |= (1<<SPI2X);
#endif
// perform system reset
writeOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
delay(50);
@@ -298,6 +326,14 @@ uint8_t Enc28J60Network::readByte(uint16_t addr)
writeRegPair(ERDPTL, addr);
CSACTIVE;
#if ENC28J60_USE_SPILIB
// issue read command
SPI.transfer(ENC28J60_READ_BUF_MEM);
// read data
uint8_t c = SPI.transfer(0x00);
CSPASSIVE;
return (c);
#else
// issue read command
SPDR = ENC28J60_READ_BUF_MEM;
waitspi();
@@ -306,6 +342,7 @@ uint8_t Enc28J60Network::readByte(uint16_t addr)
waitspi();
CSPASSIVE;
return (SPDR);
#endif
}
void Enc28J60Network::writeByte(uint16_t addr, uint8_t data)
@@ -313,12 +350,19 @@ void Enc28J60Network::writeByte(uint16_t addr, uint8_t data)
writeRegPair(EWRPTL, addr);
CSACTIVE;
#if ENC28J60_USE_SPILIB
// issue write command
SPI.transfer(ENC28J60_WRITE_BUF_MEM);
// write data
SPI.transfer(data);
#else
// issue write command
SPDR = ENC28J60_WRITE_BUF_MEM;
waitspi();
// write data
SPDR = data;
waitspi();
#endif
CSPASSIVE;
}
@@ -397,6 +441,20 @@ Enc28J60Network::readOp(uint8_t op, uint8_t address)
{
CSACTIVE;
// issue read command
#if ENC28J60_USE_SPILIB
SPI.transfer(op | (address & ADDR_MASK));
// read data
if(address & 0x80)
{
// do dummy read if needed (for mac and mii, see datasheet page 29)
SPI.transfer(0x00);
}
uint8_t c = SPI.transfer(0x00);
// release CS
CSPASSIVE;
return(c);
#else
// issue read command
SPDR = op | (address & ADDR_MASK);
waitspi();
// read data
@@ -411,6 +469,7 @@ Enc28J60Network::readOp(uint8_t op, uint8_t address)
// release CS
CSPASSIVE;
return(SPDR);
#endif
}
void
@@ -418,11 +477,18 @@ Enc28J60Network::writeOp(uint8_t op, uint8_t address, uint8_t data)
{
CSACTIVE;
// issue write command
#if ENC28J60_USE_SPILIB
SPI.transfer(op | (address & ADDR_MASK));
// write data
SPI.transfer(data);
#else
// issue write command
SPDR = op | (address & ADDR_MASK);
waitspi();
// write data
SPDR = data;
waitspi();
#endif
CSPASSIVE;
}
@@ -431,15 +497,23 @@ Enc28J60Network::readBuffer(uint16_t len, uint8_t* data)
{
CSACTIVE;
// issue read command
#if ENC28J60_USE_SPILIB
SPI.transfer(ENC28J60_READ_BUF_MEM);
#else
SPDR = ENC28J60_READ_BUF_MEM;
waitspi();
#endif
while(len)
{
len--;
// read data
#if ENC28J60_USE_SPILIB
*data = SPI.transfer(0x00);
#else
SPDR = 0x00;
waitspi();
*data = SPDR;
#endif
data++;
}
//*data='\0';
@@ -451,15 +525,24 @@ Enc28J60Network::writeBuffer(uint16_t len, uint8_t* data)
{
CSACTIVE;
// issue write command
#if ENC28J60_USE_SPILIB
SPI.transfer(ENC28J60_WRITE_BUF_MEM);
#else
SPDR = ENC28J60_WRITE_BUF_MEM;
waitspi();
#endif
while(len)
{
len--;
// write data
#if ENC28J60_USE_SPILIB
SPI.transfer(*data);
data++;
#else
SPDR = *data;
data++;
waitspi();
#endif
}
CSPASSIVE;
}
@@ -552,27 +635,40 @@ Enc28J60Network::chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t
len = setReadPtr(handle, pos, len)-1;
CSACTIVE;
// issue read command
#if ENC28J60_USE_SPILIB
SPI.transfer(ENC28J60_READ_BUF_MEM);
#else
SPDR = ENC28J60_READ_BUF_MEM;
waitspi();
#endif
uint16_t i;
for (i = 0; i < len; i+=2)
{
// read data
#if ENC28J60_USE_SPILIB
t = SPI.transfer(0x00) << 8;
t += SPI.transfer(0x00);
#else
SPDR = 0x00;
waitspi();
t = SPDR << 8;
SPDR = 0x00;
waitspi();
t += SPDR;
#endif
sum += t;
if(sum < t) {
sum++; /* carry */
}
}
if(i == len) {
#if ENC28J60_USE_SPILIB
t = (SPI.transfer(0x00) << 8) + 0;
#else
SPDR = 0x00;
waitspi();
t = (SPDR << 8) + 0;
#endif
sum += t;
if(sum < t) {
sum++; /* carry */
@@ -27,11 +27,18 @@
#include "mempool.h"
#define ENC28J60_CONTROL_CS SS
#define ENC28J60_CONTROL_CS SS // this is pin 10 on Uno and pin 53 on Mega256
#if defined(ARDUINO_ARCH_AVR)
// AVR-specific code
#define SPI_MOSI MOSI
#define SPI_MISO MISO
#define SPI_SCK SCK
#define SPI_SS SS
#define ENC28J60_USE_SPILIB 0
#elif defined(ARDUINO_ARCH_SAM)
#define ENC28J60_USE_SPILIB 1
#endif
#define UIP_RECEIVEBUFFERHANDLE 0xff
@@ -190,7 +190,7 @@ static u16_t lastport; /* Keeps track of the last port used for
/* Temporary variables. */
u8_t uip_acc32[4];
static u8_t c, opt;
static u8_t cc, opt;
static u16_t tmp16;
/* Structures and definitions. */
@@ -378,19 +378,19 @@ uip_udpchksum(void)
void
uip_init(void)
{
for(c = 0; c < UIP_LISTENPORTS; ++c) {
uip_listenports[c] = 0;
for(cc = 0; cc < UIP_LISTENPORTS; ++cc) {
uip_listenports[cc] = 0;
}
for(c = 0; c < UIP_CONNS; ++c) {
uip_conns[c].tcpstateflags = UIP_CLOSED;
for(cc = 0; cc < UIP_CONNS; ++cc) {
uip_conns[cc].tcpstateflags = UIP_CLOSED;
}
#if UIP_ACTIVE_OPEN
lastport = 1024;
#endif /* UIP_ACTIVE_OPEN */
#if UIP_UDP
for(c = 0; c < UIP_UDP_CONNS; ++c) {
uip_udp_conns[c].lport = 0;
for(cc = 0; cc < UIP_UDP_CONNS; ++cc) {
uip_udp_conns[cc].lport = 0;
}
#endif /* UIP_UDP */
@@ -418,8 +418,8 @@ uip_connect(uip_ipaddr_t *ripaddr, u16_t rport)
/* Check if this port is already in use, and if so try to find
another one. */
for(c = 0; c < UIP_CONNS; ++c) {
conn = &uip_conns[c];
for(cc = 0; cc < UIP_CONNS; ++cc) {
conn = &uip_conns[cc];
if(conn->tcpstateflags != UIP_CLOSED &&
conn->lport == htons(lastport)) {
goto again;
@@ -427,8 +427,8 @@ uip_connect(uip_ipaddr_t *ripaddr, u16_t rport)
}
conn = 0;
for(c = 0; c < UIP_CONNS; ++c) {
cconn = &uip_conns[c];
for(cc = 0; cc < UIP_CONNS; ++cc) {
cconn = &uip_conns[cc];
if(cconn->tcpstateflags == UIP_CLOSED) {
conn = cconn;
break;
@@ -482,17 +482,17 @@ uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport)
lastport = 4096;
}
for(c = 0; c < UIP_UDP_CONNS; ++c) {
if(uip_udp_conns[c].lport == htons(lastport)) {
for(cc = 0; cc < UIP_UDP_CONNS; ++cc) {
if(uip_udp_conns[cc].lport == htons(lastport)) {
goto again;
}
}
conn = 0;
for(c = 0; c < UIP_UDP_CONNS; ++c) {
if(uip_udp_conns[c].lport == 0) {
conn = &uip_udp_conns[c];
for(cc = 0; cc < UIP_UDP_CONNS; ++cc) {
if(uip_udp_conns[cc].lport == 0) {
conn = &uip_udp_conns[cc];
break;
}
}
@@ -517,9 +517,9 @@ uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport)
void
uip_unlisten(u16_t port)
{
for(c = 0; c < UIP_LISTENPORTS; ++c) {
if(uip_listenports[c] == port) {
uip_listenports[c] = 0;
for(cc = 0; cc < UIP_LISTENPORTS; ++cc) {
if(uip_listenports[cc] == port) {
uip_listenports[cc] = 0;
return;
}
}
@@ -528,9 +528,9 @@ uip_unlisten(u16_t port)
void
uip_listen(u16_t port)
{
for(c = 0; c < UIP_LISTENPORTS; ++c) {
if(uip_listenports[c] == 0) {
uip_listenports[c] = port;
for(cc = 0; cc < UIP_LISTENPORTS; ++cc) {
if(uip_listenports[cc] == 0) {
uip_listenports[cc] = port;
return;
}
}
@@ -1206,8 +1206,8 @@ uip_process(u8_t flag)
tmp16 = BUF->destport;
/* Next, check listening connections. */
for(c = 0; c < UIP_LISTENPORTS; ++c) {
if(tmp16 == uip_listenports[c])
for(cc = 0; cc < UIP_LISTENPORTS; ++cc) {
if(tmp16 == uip_listenports[cc])
goto found_listen;
}
@@ -1227,21 +1227,21 @@ uip_process(u8_t flag)
BUF->tcpoffset = 5 << 4;
/* Flip the seqno and ackno fields in the TCP header. */
c = BUF->seqno[3];
cc = BUF->seqno[3];
BUF->seqno[3] = BUF->ackno[3];
BUF->ackno[3] = c;
BUF->ackno[3] = cc;
c = BUF->seqno[2];
cc = BUF->seqno[2];
BUF->seqno[2] = BUF->ackno[2];
BUF->ackno[2] = c;
BUF->ackno[2] = cc;
c = BUF->seqno[1];
cc = BUF->seqno[1];
BUF->seqno[1] = BUF->ackno[1];
BUF->ackno[1] = c;
BUF->ackno[1] = cc;
c = BUF->seqno[0];
cc = BUF->seqno[0];
BUF->seqno[0] = BUF->ackno[0];
BUF->ackno[0] = c;
BUF->ackno[0] = cc;
/* We also have to increase the sequence number we are
acknowledging. If the least significant byte overflowed, we need
@@ -1277,15 +1277,15 @@ uip_process(u8_t flag)
CLOSED connections are found. Thanks to Eddie C. Dost for a very
nice algorithm for the TIME_WAIT search. */
uip_connr = 0;
for(c = 0; c < UIP_CONNS; ++c) {
if(uip_conns[c].tcpstateflags == UIP_CLOSED) {
uip_connr = &uip_conns[c];
for(cc = 0; cc < UIP_CONNS; ++cc) {
if(uip_conns[cc].tcpstateflags == UIP_CLOSED) {
uip_connr = &uip_conns[cc];
break;
}
if(uip_conns[c].tcpstateflags == UIP_TIME_WAIT) {
if(uip_conns[cc].tcpstateflags == UIP_TIME_WAIT) {
if(uip_connr == 0 ||
uip_conns[c].timer > uip_connr->timer) {
uip_connr = &uip_conns[c];
uip_conns[cc].timer > uip_connr->timer) {
uip_connr = &uip_conns[cc];
}
}
}
@@ -1325,19 +1325,19 @@ uip_process(u8_t flag)
/* Parse the TCP MSS option, if present. */
if((BUF->tcpoffset & 0xf0) > 0x50) {
for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c];
for(cc = 0; cc < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + cc];
if(opt == TCP_OPT_END) {
/* End of options. */
break;
} else if(opt == TCP_OPT_NOOP) {
++c;
++cc;
/* NOP option. */
} else if(opt == TCP_OPT_MSS &&
uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + cc] == TCP_OPT_MSS_LEN) {
/* An MSS option with the right option length. */
tmp16 = ((u16_t)uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
(u16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c];
tmp16 = ((u16_t)uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + cc] << 8) |
(u16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + cc];
uip_connr->initialmss = uip_connr->mss =
tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
@@ -1346,12 +1346,12 @@ uip_process(u8_t flag)
} else {
/* All other options have a length field, so that we easily
can skip past them. */
if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + cc] == 0) {
/* If the length field is zero, the options are malformed
and we don't process them further. */
break;
}
c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
cc += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + cc];
}
}
}
@@ -1395,11 +1395,11 @@ uip_process(u8_t flag)
}
/* Calculated the length of the data, if the application has sent
any data to us. */
c = (BUF->tcpoffset >> 4) << 2;
cc = (BUF->tcpoffset >> 4) << 2;
/* uip_len will contain the length of the actual TCP data. This is
calculated by subtracing the length of the TCP header (in
c) and the length of the IP header (20 bytes). */
uip_len = uip_len - c - UIP_IPH_LEN;
uip_len = uip_len - cc - UIP_IPH_LEN;
/* First, check if the sequence number of the incoming packet is
what we're expecting next. If not, we send out an ACK with the
@@ -1494,19 +1494,19 @@ uip_process(u8_t flag)
/* Parse the TCP MSS option, if present. */
if((BUF->tcpoffset & 0xf0) > 0x50) {
for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c];
for(cc = 0; cc < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + cc];
if(opt == TCP_OPT_END) {
/* End of options. */
break;
} else if(opt == TCP_OPT_NOOP) {
++c;
++cc;
/* NOP option. */
} else if(opt == TCP_OPT_MSS &&
uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + cc] == TCP_OPT_MSS_LEN) {
/* An MSS option with the right option length. */
tmp16 = (uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c];
tmp16 = (uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + cc] << 8) |
uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + cc];
uip_connr->initialmss =
uip_connr->mss = tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
@@ -1515,12 +1515,12 @@ uip_process(u8_t flag)
} else {
/* All other options have a length field, so that we easily
can skip past them. */
if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + cc] == 0) {
/* If the length field is zero, the options are malformed
and we don't process them further. */
break;
}
c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
cc += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + cc];
}
}
}
@@ -1,34 +0,0 @@
#!/usr/bin/perl
#tcpclient.pl
use IO::Socket::INET;
# flush after every write
$| = 1;
my ($socket,$client_socket);
# creating object interface of IO::Socket::INET modules which internally creates
# socket, binds and connects to the TCP server running on the specific port.
$socket = new IO::Socket::INET (
PeerHost => '192.168.0.6',
PeerPort => '1000',
Proto => 'tcp',
) or die "ERROR in Socket Creation : $!\n";
print "TCP Connection Success.\n";
# write on the socket to server.
$data = "DATA from Client";
print $socket "$data\n";
# we can also send the data through IO::Socket::INET module,
# $socket->send($data);
# read the socket data sent by server.
$data = <$socket>;
# we can also read from socket through recv() in IO::Socket::INET
# $socket->recv($data,1024);
print "Received from Server : $data\n";
sleep (10);
$socket->close();
@@ -1,53 +0,0 @@
#!/usr/bin/perl
#tcpserver.pl
use IO::Socket::INET;
# flush after every write
$| = 1;
my ($socket,$client_socket);
my ($peeraddress,$peerport);
# creating object interface of IO::Socket::INET modules which internally does
# socket creation, binding and listening at the specified port address.
$socket = new IO::Socket::INET (
LocalHost => '192.168.0.1',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
) or die "ERROR in Socket Creation : $!\n";
print "SERVER Waiting for client connection on port 5000\n";
while(1)
{
# waiting for new client connection.
$client_socket = $socket->accept();
# get the host and port number of newly connected client.
$peer_address = $client_socket->peerhost();
$peer_port = $client_socket->peerport();
print "Accepted New Client Connection From : $peer_address, $peer_port\n ";
# read operation on the newly accepted client
$data = <$client_socket>;
# we can also read from socket through recv() in IO::Socket::INET
# $client_socket->recv($data,1024);
print "Received from Client : $data\n";
# write operation on the newly accepted client.
$data = "DATA from Server";
print $client_socket "$data\n";
# we can also send the data through IO::Socket::INET module,
# $client_socket->send($data);
sleep(1);
$client_socket->close();
}
$socket->close();
@@ -1,26 +0,0 @@
#!/usr/bin/perl
#udpclient.pl
use IO::Socket::INET;
# flush after every write
$| = 1;
my ($socket,$data);
# We call IO::Socket::INET->new() to create the UDP Socket
# and bind with the PeerAddr.
$socket = new IO::Socket::INET (
PeerAddr => '192.168.0.6:5000',
Proto => 'udp'
) or die "ERROR in Socket Creation : $!\n";
#send operation
$data = "data from client";
$socket->send($data);
#read operation
$data = <$socket>;
print "Data received from socket : $data\n ";
sleep(10);
$socket->close();
@@ -1,40 +0,0 @@
#!/usr/bin/perl
#udpserver.pl
use IO::Socket::INET;
# flush after every write
$| = 1;
my ($socket,$received_data);
my ($peeraddress,$peerport);
# we call IO::Socket::INET->new() to create the UDP Socket and bound
# to specific port number mentioned in LocalPort and there is no need to provide
# LocalAddr explicitly as in TCPServer.
$socket = new IO::Socket::INET (
LocalPort => '5000',
Proto => 'udp',
) or die "ERROR in Socket Creation : $!\n";
while(1)
{
# read operation on the socket
$socket->recv($recieved_data,1024);
#get the peerhost and peerport at which the recent data received.
$peer_address = $socket->peerhost();
$peer_port = $socket->peerport();
print "($peer_address , $peer_port) said : $recieved_data\n";
#send the data to the client at which the read/write operations done recently.
$data = "data from server\n";
$socket->send($data);
print $socket "$data";
}
$socket->close();
@@ -63,8 +63,9 @@
#define MY_RADIO_NRF24
// W5100 Ethernet gateway
#define MY_GATEWAY_W5100
// Enable gateway type
//#define MY_GATEWAY_W5100
#define MY_GATEWAY_ENC28J60
// Set default gateway protocol (http://www.mysensors.org/download/serial_api_15)
#define MY_GATEWAY_PROTOCOL_DEFAULT