coppino/coppino.ino

80 lines
2.0 KiB
C++

#include "coppino.h"
namespace coppino {
ipv6::IPv6Addr address;
void handler() {
char buffer[LEN];
int r;
while ((r = slip::recv(buffer, LEN)) != -1) {
ipv6::IPv6Packet packet;
packet.deserialize(buffer, r);
packet.doAction();
}
}
void hexdump(const char* pointer, int len) {
for (int i = 0; i < len; ++i) {
Serial.print(pointer[i] & 0xff, HEX);
Serial.print('.');
}
}
uint16_t compute_checksum(const char* src_addr, const char* dst_addr, uint8_t next_header, const char* payload, int len) {
char buffer[LEN];
uint32_t total;
uint16_t* ptr;
int words;
int i = len;
memcpy(buffer, payload, len);
if (len % 2) {
buffer[len] = 0;
i++;
}
memcpy(buffer + i, src_addr, 16); i += 16;
memcpy(buffer + i, dst_addr, 16); i += 16;
memcpy(buffer + i, "\0\0", 2); i += 2;
buffer[i] = len >> 8; i += 1;
buffer[i] = len & 0xff; i += 1;
memcpy(buffer + i, "\0\0\0", 3); i += 3;
buffer[i] = next_header; i += 1;
total = 0;
ptr = (uint16_t*)buffer;
words = (i + 1) / 2;
while (words--) total += *ptr++;
while (total & 0xffff0000)
total = (total >> 16) + (total & 0xffff);
//total -= 64*256; // TODO -- this is an ugly fix, something is wrong somewhere else
return ~((uint16_t) total);
/*
uint16_t checksum = 0;
for (i = 0; i < len; i = i + 2) {
part = ((*(packet + i + 0)) << 8) + *(packet + i + 1);
checksum += part;
}
for (i = 0; i < 16; i = i + 2 ) {
part = ((*(src_addr + i + 0)) << 8) + *(src_addr + i + 1);
checksum += part;
part = ((*(dst_addr + i + 0)) << 8) + *(dst_addr + i + 1);
checksum += part;
}
checksum += (len + 58); // upper-layer packet length + next header
while (checksum >> 16)
checksum = (checksum & 0xffff) + (checksum >> 16);
*/
}
void blink() {
digitalWrite(13, !digitalRead(13));
}
}