From fabd0886b68b2636a26bf0fc692e1ea4d2c6ac5e Mon Sep 17 00:00:00 2001 From: giomba Date: Tue, 24 Dec 2019 16:00:09 +0100 Subject: [PATCH] more consistent usage of data structures in the code --- coppino-main.ino | 23 ++--------------------- ipv6.h | 10 +++++----- ipv6.ino | 23 ++++++++++------------- udp.h | 4 ++-- udp.ino | 14 +++++++------- 5 files changed, 26 insertions(+), 48 deletions(-) diff --git a/coppino-main.ino b/coppino-main.ino index e7c43e3..94f2a81 100644 --- a/coppino-main.ino +++ b/coppino-main.ino @@ -5,30 +5,11 @@ void setup() { pinMode(13, OUTPUT); - Serial.begin(9600); + Serial.begin(19200); memcpy(&coppino::address, "\x20\x01\x04\x70\xc8\x44\x00\x31\x00\x00\x00\x00\x00\x00\xca\xfe", 16); } void loop() { - - /* some UDP stuff, just to test */ - char udp_packet[64]; - memcpy(udp_packet, "\x00\x00\x77\x77\x00\x12\x00\x00helloworld", 18); - - ipv6::IPv6Packet ip_packet; - - ip_packet.setPayload(udp_packet, 18); - ip_packet.setSrcAddress(coppino::address); - - // ipv6::IPv6Addr dst_addr("\x20\x01\x04\x70\xc8\x44\x00\x30\x53\x47\xde\x2d\x41\xb1\x5b\x8c"); - ipv6::IPv6Addr dst_addr("\x20\x01\x04\x70\xc8\x44\x00\x31\x00\x00\x00\x00\x00\x00\x00\x01"); - ip_packet.setDstAddress(dst_addr); - - ip_packet.setNextHeader(17); // UDP - - // slip::send(&ip_packet, 18 + 40); // ?? - + /* network service routing */ coppino::handler(); - - //delay(5000); } diff --git a/ipv6.h b/ipv6.h index a7c7231..8c2e592 100644 --- a/ipv6.h +++ b/ipv6.h @@ -35,8 +35,8 @@ namespace ipv6 { public: IPv6Packet(); IPv6Packet(const char* buffer, int len); - void setSrcAddress(IPv6Addr& address); - void setDstAddress(IPv6Addr& address); + void setSrcAddress(const IPv6Addr* address); + void setDstAddress(const IPv6Addr* address); void setNextHeader(uint8_t next_header); void setFlow(const char* flow); void setPayload(char* payload, int len); @@ -45,12 +45,12 @@ namespace ipv6 { }; /* Note: content of message may be changed */ - void handleICMP(const char* src, const char* dst, const char* flow, char* message, int len); + void handleICMP(const IPv6Addr* src, const IPv6Addr* dst, const char* flow, char* message, int len); /* Compute internet checksum. Actually it is not so straightforward: */ uint16_t compute_checksum( - const char* src_addr, /* source IPv6 address */ - const char* dst_addr, /* destination IPv6 address */ + const IPv6Addr* src_addr, /* source IPv6 address */ + const IPv6Addr* dst_addr, /* destination IPv6 address */ uint8_t next_header, /* IPv6 next header number */ int upper_len, /* length as found in the upper layer protocol */ const char* payload, /* IPv6 payload */ diff --git a/ipv6.ino b/ipv6.ino index 1198f86..8dfd247 100644 --- a/ipv6.ino +++ b/ipv6.ino @@ -6,7 +6,7 @@ namespace ipv6 { const IPv6Addr ALL_NODES_ADDRESS("\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"); /* ff02::1 */ /******** FUNCTIONS *******/ -uint16_t compute_checksum(const char* src_addr, const char* dst_addr, uint8_t next_header, int upper_len, const char* payload, int len) { +uint16_t compute_checksum(const IPv6Addr* src_addr, const IPv6Addr* dst_addr, uint8_t next_header, int upper_len, const char* payload, int len) { char buffer[LEN]; uint32_t total; uint16_t* ptr; @@ -67,11 +67,11 @@ void IPv6Packet::setNextHeader(uint8_t next_header) { *(packet + 6) = next_header; } -void IPv6Packet::setSrcAddress(IPv6Addr& address) { - memcpy(packet + 8, (void*)&address, 16); +void IPv6Packet::setSrcAddress(const IPv6Addr* address) { + memcpy(packet + 8, address, 16); } -void IPv6Packet::setDstAddress(IPv6Addr& address) { - memcpy(packet + 24, (void*)&address, 16); +void IPv6Packet::setDstAddress(const IPv6Addr* address) { + memcpy(packet + 24, address, 16); } void IPv6Packet::setFlow(const char* flow) { @@ -95,10 +95,10 @@ void IPv6Packet::doAction() { switch(*(packet + 6)) { /* next header */ case NH_ICMP: - handleICMP(packet + 8, packet + 24, packet + 1, packet + 40, len); + handleICMP((IPv6Addr*)(packet + 8), (IPv6Addr*)(packet + 24), packet + 1, packet + 40, len); break; case NH_UDP: - udp::handleUDP(packet + 8, packet + 24, packet + 1, packet + 40, len); + udp::handleUDP((IPv6Addr*)(packet + 8), (IPv6Addr*)(packet + 24), packet + 1, packet + 40, len); break; default: /* no other protocols are known here, sorry :-) */ @@ -107,7 +107,7 @@ void IPv6Packet::doAction() { } } -void handleICMP(const char* src_addr, const char* dst_addr, const char* flow, char* packet, int len) { +void handleICMP(const IPv6Addr* src_addr, const IPv6Addr* dst_addr, const char* flow, char* packet, int len) { uint8_t type = *(packet); if (type == ICMP_ECHO_REQUEST_TYPE) { /* if it is ICMPv6 Echo Request, then... */ @@ -132,11 +132,8 @@ void handleICMP(const char* src_addr, const char* dst_addr, const char* flow, ch reply_packet.setPayload(packet, len); reply_packet.setFlow(flow); - IPv6Addr tmp_addr; - memcpy(&tmp_addr, dst_addr, 16); - reply_packet.setSrcAddress(tmp_addr); - memcpy(&tmp_addr, src_addr, 16); - reply_packet.setDstAddress(tmp_addr); + reply_packet.setSrcAddress(dst_addr); + reply_packet.setDstAddress(src_addr); reply_packet.setNextHeader(NH_ICMP); slip::send((void*)&reply_packet, 40 + len); } diff --git a/udp.h b/udp.h index f3fa5a4..5ecc41e 100644 --- a/udp.h +++ b/udp.h @@ -17,10 +17,10 @@ namespace udp { void setDstPort(uint16_t port); uint16_t getDstPort(); void setPayload(const char* payload, int len); - void computeChecksum(const char* src_addr, const char* dst_addr, int len); + void computeChecksum(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, int len); }; - void handleUDP(const char* src_addr, const char* dst_addr, const char* flow, char* packet, int len); + void handleUDP(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, const char* flow, char* packet, int len); } #endif diff --git a/udp.ino b/udp.ino index b6a24d1..e20db65 100644 --- a/udp.ino +++ b/udp.ino @@ -33,13 +33,13 @@ void UDPPacket::setPayload(const char* payload, int len) { *(packet + 5) = (len + 8) & 0xff; } -void UDPPacket::computeChecksum(const char* src_addr, const char* dst_addr, int len) { +void UDPPacket::computeChecksum(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, int len) { memset(packet + 6, 0, 2); uint16_t checksum = ipv6::compute_checksum(src_addr, dst_addr, ipv6::NH_UDP, len, packet, len); memcpy(packet + 6, &checksum, 2); } -void handleUDP(const char* src_addr, const char* dst_addr, const char* flow, char* packet, int len) { +void handleUDP(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, const char* flow, char* packet, int len) { UDPPacket udp_packet(packet, len); /* swap ports */ @@ -55,11 +55,11 @@ void handleUDP(const char* src_addr, const char* dst_addr, const char* flow, cha reply_packet.setPayload((char*)&udp_packet, len); reply_packet.setFlow(flow); - ipv6::IPv6Addr tmp_addr; - memcpy(&tmp_addr, dst_addr, 16); - reply_packet.setSrcAddress(tmp_addr); - memcpy(&tmp_addr, src_addr, 16); - reply_packet.setDstAddress(tmp_addr); + //ipv6::IPv6Addr tmp_addr; + //memcpy(&tmp_addr, dst_addr, 16); + reply_packet.setSrcAddress(dst_addr); + //memcpy(&tmp_addr, src_addr, 16); + reply_packet.setDstAddress(src_addr); reply_packet.setNextHeader(ipv6::NH_UDP); slip::send((void*)&reply_packet, 40 + len); }