simple udp server handler
This commit is contained in:
parent
fabd0886b6
commit
ba2f76f7e6
@ -1,12 +1,20 @@
|
|||||||
#include "coppino.h"
|
#include "coppino.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
#include "slip.h"
|
#include "slip.h"
|
||||||
|
#include "udp.h"
|
||||||
|
|
||||||
|
void udp_server(const char* buffer, int len) {
|
||||||
|
digitalWrite(13, !digitalRead(13));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
pinMode(13, OUTPUT);
|
pinMode(13, OUTPUT);
|
||||||
|
|
||||||
Serial.begin(19200);
|
Serial.begin(19200);
|
||||||
memcpy(&coppino::address, "\x20\x01\x04\x70\xc8\x44\x00\x31\x00\x00\x00\x00\x00\x00\xca\xfe", 16);
|
memcpy(&coppino::address, "\x20\x01\x04\x70\xc8\x44\x00\x31\x00\x00\x00\x00\x00\x00\xca\xfe", 16);
|
||||||
|
|
||||||
|
udp::set_handler(80, udp_server);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
5
udp.h
5
udp.h
@ -21,6 +21,11 @@ namespace udp {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void handleUDP(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* 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);
|
||||||
|
|
||||||
|
extern void(*server_handler) (const char* buffer, int size);
|
||||||
|
extern uint16_t server_port;
|
||||||
|
|
||||||
|
void set_handler(uint16_t port, void(* handler) (const char* buffer, int size));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
17
udp.ino
17
udp.ino
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
namespace udp {
|
namespace udp {
|
||||||
|
|
||||||
|
void(*server_handler) (const char* buffer, int size) = NULL;
|
||||||
|
uint16_t server_port = 0;
|
||||||
|
|
||||||
UDPPacket::UDPPacket() {
|
UDPPacket::UDPPacket() {
|
||||||
memset(packet, 0, LEN);
|
memset(packet, 0, LEN);
|
||||||
}
|
}
|
||||||
@ -39,9 +42,19 @@ void UDPPacket::computeChecksum(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6
|
|||||||
memcpy(packet + 6, &checksum, 2);
|
memcpy(packet + 6, &checksum, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_handler(uint16_t port, void(* server_handler) (const char* buffer, int size)) {
|
||||||
|
udp::server_port = port;
|
||||||
|
udp::server_handler = server_handler;
|
||||||
|
}
|
||||||
|
|
||||||
void handleUDP(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* 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);
|
UDPPacket udp_packet(packet, len);
|
||||||
|
|
||||||
|
if (udp_packet.getDstPort() == server_port) { /* call user-defined server handler */
|
||||||
|
if (server_port != 0 && server_handler != NULL) {
|
||||||
|
server_handler(packet + 8, len - 8);
|
||||||
|
}
|
||||||
|
} else { /* echo default UDP application handler */
|
||||||
/* swap ports */
|
/* swap ports */
|
||||||
uint16_t tmp;
|
uint16_t tmp;
|
||||||
tmp = udp_packet.getSrcPort();
|
tmp = udp_packet.getSrcPort();
|
||||||
@ -55,13 +68,11 @@ void handleUDP(const ipv6::IPv6Addr* src_addr, const ipv6::IPv6Addr* dst_addr, c
|
|||||||
reply_packet.setPayload((char*)&udp_packet, len);
|
reply_packet.setPayload((char*)&udp_packet, len);
|
||||||
reply_packet.setFlow(flow);
|
reply_packet.setFlow(flow);
|
||||||
|
|
||||||
//ipv6::IPv6Addr tmp_addr;
|
|
||||||
//memcpy(&tmp_addr, dst_addr, 16);
|
|
||||||
reply_packet.setSrcAddress(dst_addr);
|
reply_packet.setSrcAddress(dst_addr);
|
||||||
//memcpy(&tmp_addr, src_addr, 16);
|
|
||||||
reply_packet.setDstAddress(src_addr);
|
reply_packet.setDstAddress(src_addr);
|
||||||
reply_packet.setNextHeader(ipv6::NH_UDP);
|
reply_packet.setNextHeader(ipv6::NH_UDP);
|
||||||
slip::send((void*)&reply_packet, 40 + len);
|
slip::send((void*)&reply_packet, 40 + len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user