more consistent usage of data structures in the code
This commit is contained in:
parent
b21625cd27
commit
fabd0886b6
@ -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);
|
||||
}
|
||||
|
10
ipv6.h
10
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 */
|
||||
|
23
ipv6.ino
23
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);
|
||||
}
|
||||
|
4
udp.h
4
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
|
||||
|
14
udp.ino
14
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user