added comments for UDP part
This commit is contained in:
parent
260f537125
commit
ac955647cf
15
udp.h
15
udp.h
@ -2,30 +2,25 @@
|
|||||||
#define COPPINO_UDP_H
|
#define COPPINO_UDP_H
|
||||||
|
|
||||||
namespace udp {
|
namespace udp {
|
||||||
|
|
||||||
const uint8_t LEN = 128;
|
|
||||||
|
|
||||||
class UDPPacket {
|
class UDPPacket {
|
||||||
private:
|
private:
|
||||||
char packet[LEN];
|
char packet[ipv6::LEN - 40];
|
||||||
public:
|
public:
|
||||||
UDPPacket();
|
|
||||||
UDPPacket(const char* packet, int len);
|
|
||||||
|
|
||||||
void setSrcPort(uint16_t port);
|
void setSrcPort(uint16_t port);
|
||||||
uint16_t getSrcPort();
|
uint16_t getSrcPort();
|
||||||
void setDstPort(uint16_t port);
|
void setDstPort(uint16_t port);
|
||||||
uint16_t getDstPort();
|
uint16_t getDstPort();
|
||||||
const char* UDPPacket::getPayload();
|
const char* UDPPacket::getPayload();
|
||||||
void setPayload(const char* payload, int len);
|
void setPayload(const char* payload, int len); /* also sets proper length */
|
||||||
void computeChecksum(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, int len);
|
void computeChecksum(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, int len); /* computes and updates checksum in the packet */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* UDP handler for lower layer protocol */
|
||||||
int handleUDP(char* output_buffer, const char* input_buffer, int len);
|
int handleUDP(char* output_buffer, const char* input_buffer, int len);
|
||||||
|
|
||||||
|
/* pointer to server handler function */
|
||||||
extern int(*server_handler) (char* output_buffer, const char* buffer, int size);
|
extern int(*server_handler) (char* output_buffer, const char* buffer, int size);
|
||||||
extern uint16_t server_port;
|
extern uint16_t server_port;
|
||||||
|
|
||||||
void set_handler(uint16_t port, int(* handler) (char* output_buffer, const char* input_buffer, int size));
|
void set_handler(uint16_t port, int(* handler) (char* output_buffer, const char* input_buffer, int size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
17
udp.ino
17
udp.ino
@ -5,14 +5,6 @@ namespace udp {
|
|||||||
int(*server_handler) (char* output_buffer, const char* input_buffer, int size) = NULL;
|
int(*server_handler) (char* output_buffer, const char* input_buffer, int size) = NULL;
|
||||||
uint16_t server_port = 0;
|
uint16_t server_port = 0;
|
||||||
|
|
||||||
UDPPacket::UDPPacket() {
|
|
||||||
memset(packet, 0, LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
UDPPacket::UDPPacket(const char* buffer, int len) {
|
|
||||||
memcpy(packet, buffer, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UDPPacket::setSrcPort(uint16_t port) {
|
void UDPPacket::setSrcPort(uint16_t port) {
|
||||||
*(packet + 0) = port >> 8;
|
*(packet + 0) = port >> 8;
|
||||||
*(packet + 1) = port & 0xff;
|
*(packet + 1) = port & 0xff;
|
||||||
@ -30,6 +22,7 @@ uint16_t UDPPacket::getDstPort() {
|
|||||||
return (*(packet + 2) << 8) + (uint8_t)*(packet + 3);
|
return (*(packet + 2) << 8) + (uint8_t)*(packet + 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* sets the payload and also updates the packet length field */
|
||||||
void UDPPacket::setPayload(const char* payload, int len) {
|
void UDPPacket::setPayload(const char* payload, int len) {
|
||||||
memcpy(packet + 8, payload, len);
|
memcpy(packet + 8, payload, len);
|
||||||
*(packet + 4) = (len + 8) >> 8;
|
*(packet + 4) = (len + 8) >> 8;
|
||||||
@ -39,17 +32,22 @@ const char* UDPPacket::getPayload() {
|
|||||||
return packet + 8;
|
return packet + 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* computes the checksum and also updates it inside the UDP packet */
|
||||||
void UDPPacket::computeChecksum(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, int len) {
|
void UDPPacket::computeChecksum(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, int len) {
|
||||||
memset(packet + 6, 0, 2);
|
memset(packet + 6, 0, 2);
|
||||||
uint16_t checksum = ipv6::compute_checksum(src_addr, dst_addr, ipv6::NH_UDP, len, packet, len);
|
uint16_t checksum = ipv6::compute_checksum(src_addr, dst_addr, ipv6::NH_UDP, len, packet, len);
|
||||||
memcpy(packet + 6, &checksum, 2);
|
memcpy(packet + 6, &checksum, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* sets an handler (a function) which will be called every time there is a packet for a certain given port */
|
||||||
void set_handler(uint16_t port, int(* server_handler) (char* output_buffer, const char* input_buffer, int size)) {
|
void set_handler(uint16_t port, int(* server_handler) (char* output_buffer, const char* input_buffer, int size)) {
|
||||||
udp::server_port = port;
|
udp::server_port = port;
|
||||||
udp::server_handler = server_handler;
|
udp::server_handler = server_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* handles an UDP packet, and (possibly) produces a reply UDP packet
|
||||||
|
* returns length of reply packet, which is written in output_buffer, or -1 if there is no reply packet
|
||||||
|
*/
|
||||||
int handleUDP(char* output_buffer, const char* input_buffer, int ilen) {
|
int handleUDP(char* output_buffer, const char* input_buffer, int ilen) {
|
||||||
UDPPacket* incoming_packet = (UDPPacket*)input_buffer;
|
UDPPacket* incoming_packet = (UDPPacket*)input_buffer;
|
||||||
UDPPacket* outgoing_packet = (UDPPacket*)output_buffer;
|
UDPPacket* outgoing_packet = (UDPPacket*)output_buffer;
|
||||||
@ -62,11 +60,10 @@ int handleUDP(char* output_buffer, const char* input_buffer, int ilen) {
|
|||||||
outgoing_packet->setSrcPort(incoming_packet->getDstPort());
|
outgoing_packet->setSrcPort(incoming_packet->getDstPort());
|
||||||
outgoing_packet->setDstPort(incoming_packet->getSrcPort());
|
outgoing_packet->setDstPort(incoming_packet->getSrcPort());
|
||||||
outgoing_packet->setPayload(outgoing_packet->getPayload(), olen);
|
outgoing_packet->setPayload(outgoing_packet->getPayload(), olen);
|
||||||
//outgoing_packet->setLen(olen);
|
|
||||||
outgoing_packet->computeChecksum(ipv6::packetin.getDstAddress(), ipv6::packetin.getSrcAddress(), olen + 8);
|
outgoing_packet->computeChecksum(ipv6::packetin.getDstAddress(), ipv6::packetin.getSrcAddress(), olen + 8);
|
||||||
return olen + 8;
|
return olen + 8;
|
||||||
}
|
}
|
||||||
} else { /* echo default UDP application handler */
|
} else { /* default UDP application handler: echoes back the packet content */
|
||||||
outgoing_packet->setSrcPort(incoming_packet->getDstPort());
|
outgoing_packet->setSrcPort(incoming_packet->getDstPort());
|
||||||
outgoing_packet->setDstPort(incoming_packet->getSrcPort());
|
outgoing_packet->setDstPort(incoming_packet->getSrcPort());
|
||||||
outgoing_packet->setPayload(incoming_packet->getPayload(), ilen - 8);
|
outgoing_packet->setPayload(incoming_packet->getPayload(), ilen - 8);
|
||||||
|
Loading…
Reference in New Issue
Block a user