From ce0b019e9120d9f5b304899d8eecb3ee17944766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Thu, 24 Nov 2016 14:39:03 +0100 Subject: [PATCH] Add packetParser --- Makefile | 2 +- main.cpp | 10 ++++++ packetParser.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ packetParser.h | 27 +++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 packetParser.cpp create mode 100644 packetParser.h diff --git a/Makefile b/Makefile index 33ca1f5..7dd165b 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CXX=g++ CXXFLAGS=-Wall -Wextra -Werror -pedantic -std=c++14 -O2 CXXLIBS=-lpthread -OBJS = Bytes.o main.o protocol.o neighbours.o +OBJS = Bytes.o main.o protocol.o neighbours.o packetParser.o TARGET = jeanhubert all: $(TARGET) diff --git a/main.cpp b/main.cpp index 3e2aaea..e1ff925 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,7 @@ #include "protocol.h" #include "nw_constants.h" #include "neighbours.h" +#include "packetParser.h" #include #include #include @@ -51,11 +52,20 @@ int main(int /*argc*/, char** /*argv*/) { Neighbours neighboursManager(&proto); neighboursManager.addPotentialNei(Neighbour(jch_id, jch_addr)); + PacketParser pckParser(&neighboursManager, &proto); + // proto.sendEmpty(loc_addr); // proto.sendEmpty(jch_addr); while(true) { neighboursManager.fullUpdate(); + + while(proto.readyRead()) { + SockAddr fromAddr; + Bytes pck = proto.getPacket(&fromAddr); + pckParser.parse(pck); + } + sleep(2); } diff --git a/packetParser.cpp b/packetParser.cpp new file mode 100644 index 0000000..2ee9224 --- /dev/null +++ b/packetParser.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + * By Théophile Bastian, 2017 + * M1 Network course project at ENS Cachan, Juliusz Chroboczek. + * License: WTFPL v2 + **************************************************************************/ + +#include "packetParser.h" +#include + +PacketParser::PacketParser(Neighbours* nei, Protocol* proto) : + neighbours(nei), protocol(proto) +{} + +void PacketParser::parse(Bytes pck) { + u64 peerId; + pck >> peerId; + neighbours->receivedFrom(peerId); + + while(pck.size() > 0) { + readTLV(pck, peerId); + } +} + +void PacketParser::readTLV(Bytes& pck, u64 nei) { + u8 type, len; + pck >> type >> len; + + switch(type) { + case csts::TLV_PAD1: + case csts::TLV_PADN: + break; + + case csts::TLV_IHU: { + u64 ihuId; + pck >> ihuId; + if(ihuId != protocol->getSelfId()) + break; + + neighbours->hadIHU(nei); + break; + } + + case csts::TLV_NR: + //TODO + break; + + case csts::TLV_NEIGH: + receiveNeigh(pck, len); + break; + + case csts::TLV_DATA: + receiveData(pck, len, nei); + break; + + case csts::TLV_IHAVE: + //TODO + break; + } +} + +void PacketParser::receiveNeigh(Bytes& pck, u8 length) { + while(length >= 8+16+2) { /* enough to read one peer */ + u64 id; + u16 port; + SockAddr addr; + memset(&addr, 0, sizeof(addr)); + addr.sin6_family = AF_INET6; + + pck >> id; + for(int byte=0; byte < 16; byte++) + pck >> addr.sin6_addr.s6_addr[byte]; + pck >> port; + addr.sin6_port = htons(port); + + Neighbour nei(id, addr); + neighbours->addPotentialNei(nei); + } +} + +void PacketParser::receiveData(Bytes& pck, u8 length, u64 from) { + u32 seqNo; + u64 datId; + pck >> seqNo >> datId; + protocol->sendIHave(from, datId, seqNo); + //TODO + length++; +} + diff --git a/packetParser.h b/packetParser.h new file mode 100644 index 0000000..cacf50c --- /dev/null +++ b/packetParser.h @@ -0,0 +1,27 @@ +/*************************************************************************** + * By Théophile Bastian, 2017 + * M1 Network course project at ENS Cachan, Juliusz Chroboczek. + * License: WTFPL v2 + **************************************************************************/ + +#pragma once + +#include "neighbours.h" +#include "protocol.h" + +class PacketParser { + public: + PacketParser(Neighbours* nei, Protocol* proto); + + void parse(Bytes pck); + + private: //meth + void readTLV(Bytes& pck, u64 nei); + void receiveNeigh(Bytes& pck, u8 length); + void receiveData(Bytes& pck, u8 length, u64 from); + + private: + Neighbours* neighbours; + Protocol* protocol; +}; +