From cdef7ee0ac0488798adaa0635f4bed2333a4f12d Mon Sep 17 00:00:00 2001 From: gonzalef Date: Thu, 16 Apr 2020 15:08:22 +0200 Subject: [PATCH] solved compilation errors | changed header includes, makefile flags, pointers to arrays --- Makefile | 5 +++-- src/hash.h | 6 +++--- src/hash.o | Bin 0 -> 2648 bytes src/node.c | 15 ++++++++------- src/node.h | 44 ++++++++++++++++++++++---------------------- src/node.o | Bin 0 -> 10576 bytes src/parser.o | Bin 0 -> 2752 bytes src/tlv.h | 10 +++++----- src/tlv.o | Bin 0 -> 4744 bytes 9 files changed, 41 insertions(+), 39 deletions(-) create mode 100644 src/hash.o create mode 100644 src/node.o create mode 100644 src/parser.o create mode 100644 src/tlv.o diff --git a/Makefile b/Makefile index a365c52..3d676e4 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,17 @@ TARGET ?= dazibao SRC_DIRS ?= ./src/* CC := gcc -CFLAGS= -O2 -Wall -lssl -lcrypto +CFLAGS= -O2 -Wall SRCS := $(shell find $(SRC_DIRS) -name *.c -or -name *.s) OBJS := $(addsuffix .o,$(basename $(SRCS))) DEPS := $(OBJS:.o=.d) +SSLFLAGS = -lssl -lcrypto INC_DIRS := $(shell find $(SRC_DIRS) -type d) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) $(TARGET): $(OBJS) - $(CC) $(CFLAGS) $(OBJS) -o $@ $(LOADLIBES) $(LDLIBS) + $(CC) $(CFLAGS) $(OBJS) -o $@ $(LOADLIBES) $(LDLIBS) $(SSLFLAGS) .PHONY: clean clean: diff --git a/src/hash.h b/src/hash.h index 4f16809..748b6b1 100644 --- a/src/hash.h +++ b/src/hash.h @@ -8,16 +8,16 @@ #include "node.h" // Hash a single data -void hash_data(struct pub_data *data, unsigned char *buf); +void hash_data(pub_data *data, unsigned char *buf); // Hash every data contained in data_list then return a network hash -void hash_network(struct list *data_list, unsigned char *buf); +void hash_network(list *data_list, unsigned char *buf); // Truncate 32 octet hash to 16 octets void hash_trunc(unsigned char *hash256bit, unsigned char *buf); // Concat all fields of data and put them in buf -void concat_data(struct pub_data *data, unsigned char *buf); +void concat_data(pub_data *data, unsigned char *buf); // Concat hash2 to hash1 (hash1 is modified) void concat_hash(unsigned char *hash1, unsigned char *hash2, size_t size); diff --git a/src/hash.o b/src/hash.o new file mode 100644 index 0000000000000000000000000000000000000000..920c6ac2f74eb242bea0fe66f497943b0cf91af1 GIT binary patch literal 2648 zcmbtU&2Jk;6d$i$XK~V9C*|O(Nbw;-4x%fYwonxbyh-eg(W*g>O+jf`9LL5eiH+=C zHK3}E4}$X{GdnkdWZeTLm=bL!^p`jEEZEjAxS3){ziAY4*MO z&F_8en~!TLBQ5!Sh>H)sf(~XJMd;1013O90B`K^4hnx-UUXfZE z=L%}!=G8vjc+koWwTz*!M}2G9`F`!8e;eOiFKIlVD^V{uEA8q|7VSc;MN){fq29_$ zk4pr6Ebw#K`Dp?>+qm)D*%|Bx24g_RPHHo;s;+byO&r3F)#HO(en5wAW9R2h5)C(V ztA_Ipb{^1aNv)<D>bWmlTv`v};=A^dBH;HaFhm$d>_rd6{m1yrb33VF+%$y@n0Of7TF z7$4RRb3C1%NM+5eK5V2+G=cRO&b)|Bvu@=Jvu2?@YnJlw&G8r{II0!%b8}UeqEfUj zS8KCqzKxY?#UfOO(0%$vNCN#7jNQGqJYqOG2|WUSjQuykj|zA~z*Paa1-w_lKW8|} z8xruF0_ETqvb*QV=rq!p_3^Ti5am8waU^Zw99_?#dd7)cnSEVCzIi-F{fkv#m~M;QJr z!@V!ks3$L@(-_<)`gs^6=7051fG?>l4nq{4|2Yu^n;oxxeNMncYUN+nKhFHU^!FL? ztr!$+-aih%21cj;FR~3K?-LQyfAU&$f8KxcKi=E`p(JbQ2K!-hSBbCJpTza{9v~#M a{l88og7E%vh`bG*{9CO4w>Xh$um3+O42qfn literal 0 HcmV?d00001 diff --git a/src/node.c b/src/node.c index 0c33abb..b4dd698 100644 --- a/src/node.c +++ b/src/node.c @@ -163,7 +163,7 @@ void add_data(unsigned char len, long id, short seqno, char *data) { /* ---- Fin fonctions utilitaires ---- */ -int send_tlv(union tlv * tlv_to_send, int tlv_size, struct sockaddr_in6 * dest_list[], int dest_list_size, int socket_num){ +int send_tlv(union tlv * tlv_to_send, int tlv_size, struct sockaddr_in6 * dest_list, int dest_list_size, int socket_num){ // debug_print("Building packet to send a TLV."); // We first need to build the packet, @@ -276,7 +276,7 @@ int validate_tlv(char *data, int pos, short packet_len){ // For every packet recivied, // then we make sure it's conform // We then extract the data from it to make it easy to work with -int check_header(char * received_datagram[], int buffer_len, struct packet * packet_to_return){ +int check_header(char * received_datagram, int buffer_len, struct packet * packet_to_return){ packet_to_return = (packet*) received_datagram; @@ -309,9 +309,10 @@ int update_neighbours(){ }; // We then look at the differents TLVs in the packet. -int work_with_tlvs(char * data[], short packet_len, struct sockaddr_in6 sender){ +int work_with_tlvs(char * data, short packet_len, struct sockaddr_in6 sender){ int pos = 0; - unsigned char tlv_len, hash[16], warn[32]; + unsigned char tlv_len, hash[16]; + char warn[32]; tlv new_tlv, cur_tlv; list *tmp_list; pub_data *pdata; @@ -531,8 +532,8 @@ void listen_for_packets(){ // We verify the received packet is well formated, // and we return it in the struct designed to work with it. - struct packet * formated_rec_datagram; - if(check_header(&req, 1024, formated_rec_datagram) < 0){ + struct packet formated_rec_datagram; + if(check_header(req, 1024, &formated_rec_datagram) < 0){ perror(">> Error while checking the header, aborting this packet, by choice, and conviction."); continue; } @@ -541,7 +542,7 @@ void listen_for_packets(){ // struct tlv_list received_tlvs; // if (validate_tlvs(formated_rec_datagram) < 0) - int nbr_success_tlv = work_with_tlvs(&req, 1024, sender); + int nbr_success_tlv = work_with_tlvs(req, 1024, sender); if (nbr_success_tlv < 0){ perror(">> Error while treating the TLVs of the packet."); printf(">> Managed to deal with %i TLVs\n", -nbr_success_tlv ); diff --git a/src/node.h b/src/node.h index 7daef54..d84971b 100644 --- a/src/node.h +++ b/src/node.h @@ -11,20 +11,6 @@ #include #include -#include "tlv.h" -#include "hash.h" -#include "parser.h" - -// On which port do we listen to -#define LISTEN_PORT 1212 - -// The node ID -#define NODE_ID 42675882021843277 - -// The number of neighbours -// The neighbour table has 15 entries -#define NEIGHBOUR_MAX 15 - /* la table de voisins, qui est indexée par adresses de socket (des paires (IP, Port)), * et dont chaque entrée contient un booléen indiquant si le pair est permanent * (configuré au lancement) ou transitoire, et la date de dernière réception d’un @@ -45,7 +31,7 @@ typedef struct neighbour_peer { */ typedef struct pub_data { - unsigned char length; + unsigned char length; long id; short seqno; char *data; @@ -53,10 +39,24 @@ typedef struct pub_data { // General list typedef struct list { - void *data; - void *next; + void *data; + void *next; } list; +#include "tlv.h" +#include "hash.h" +#include "parser.h" + +// On which port do we listen to +#define LISTEN_PORT 1212 + +// The node ID +#define NODE_ID 42675882021843277 + +// The number of neighbours +// The neighbour table has 15 entries +#define NEIGHBOUR_MAX 15 + // Static variables static list *data_list; static list *neighbour_list; @@ -66,13 +66,13 @@ static list *neighbour_list; // fonctions signatures void listen_for_packets(); -int check_header(char * received_datagram[], int buffer_len, struct packet * packet_to_return); +int check_header(char * received_datagram, int buffer_len, packet * packet_to_return); -int validate_tlvs(struct packet * pack, struct tlv_list * tlv_l); +int validate_tlv(char *data, int pos, short packet_len); int update_neighbours(); -int work_with_tlvs(char * data[], short packet_len, struct sockaddr_in6 sender); +int work_with_tlvs(char * data, short packet_len, struct sockaddr_in6 sender); void add_tlv(struct packet *packet, union tlv *tlv, char type); @@ -81,12 +81,12 @@ void add_tlv(struct packet *packet, union tlv *tlv, char type); /* Takes a TLV and sends it over to everyone in the list of addresses. * Returns -1 in case of error, 0 otherwise. */ -int send_tlv(union tlv * tlv_to_send, int tlv_size, struct sockaddr_in6 * dest_list[], int dest_list_size, int socket_num); +int send_tlv(union tlv * tlv_to_send, int tlv_size, struct sockaddr_in6 * dest_list, int dest_list_size, int socket_num); /* Takes a list of TLV and sends them over to everyone in the list of addresses. * Returns -1 in case of error, 0 otherwise. */ -int send_tlvs(struct list * tlv_list, int tlv_size, struct sockaddr_in6 * dest_list[], int dest_list_size, int socket_num); +int send_tlvs(struct list * tlv_list, int tlv_size, struct sockaddr_in6 * dest_list, int dest_list_size, int socket_num); // threaded functions void t_ask_for_more_peers(); diff --git a/src/node.o b/src/node.o new file mode 100644 index 0000000000000000000000000000000000000000..96e7e6c9a2de0ea806aa8ebc7842069b36c667f3 GIT binary patch literal 10576 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 KUgf7<{(k^FM#4J) literal 0 HcmV?d00001 diff --git a/src/parser.o b/src/parser.o new file mode 100644 index 0000000000000000000000000000000000000000..0cdd296b3e6d45a1381d4f89dc493d8414779b6b GIT binary patch literal 2752 zcmbtV&2Jl35FclqHVvuQDMbouA(n7Zis;I28fZBnZ$1~aYAYHem6B{6dtHarAN8)G z1qmABfL6h%NFc;5NQes@dT0;jfE*PO2@dqge^88&qNq}71tQG6eXm~DwuE3JzxmB? zKHl4TA9-g|pXv$(Ku7?dho&W1fXlm^IKf~7_Cg=1FRRIKzehryNuJi6KeXlFN?ib& zb9*xw4I-~?PB0Bxtr*l+Hhc8i7twW`BBQMZhlVM_sYY{{6R&GdL)(1+IxCO-q5I1l z8)$4aq&wPIx^r7wdxU(y(4ei>?U-J>7QKarUi&)wBayXH^2O^ItUKGf^DB#8xz{CE ze?Ui8E(W98S~XfnL++QfwU61<8Es@gTMGtEM8lf1LIIldv)n%(W?TeOgrOLs7()p} z35HG~I>pdDqIrf&h)Rg6(aTs%?q4Cr>?^KKirMR~O^Vr9U7M-ZEi|;{@2II~XVq8L zS#|EFJSe{O2DMmsw(fi>e_B5X)p|wYJ-E@!Jij+RGq@wjLF4XUJ3I1VmGFZ)-H5$) zzIw@@Qa}F8e2;O z(57S8cm-`X$B-2nIy<+gcNWU#1t^${=W+|hN*R&;MzOpUvFwy>LZO&3IV=?|8(?~T z{JF?*a-mYNE0JfFQ6+YGq{6KD+wo&c?C2qv#krX5=Q{A_OAxpi4jky)-E#$3f}aKl zx$g|EbSxD9uxl(dP?M%Zkq?4uX!yNuH56Of^L$5h=oIW={9a>kfZ z$Mi`9vgb_O0>fCeis|FW4a-WW3R$!*yPPgvGSayvW~91SbN!Do zg1OWp|BXl>M-BIbX_OClEY3!UIx%oq0)U;k4+UgQb=0?+q_!To>v{c}9O zC7d^8-d9-kU(ja|wA(-N#EX5R{i9rwFL?TnmbsCe=ktfTlkOzF`Tl&m+y1>n3QGL^ ayi0~hMBfC}kDy)t0RI=26M #include -#include "node.h" -#include "hash.h" -#include "parser.h" - #define LEN_NEIGHBOUR_REQ 0 #define LEN_NEIGHBOUR 18 #define LEN_NETWORK_HASH 16 @@ -111,6 +107,10 @@ typedef union tlv { warning *warning; } tlv; +#include "node.h" +#include "hash.h" +#include "parser.h" + // build tlv from token int build_tlv(tlv *tlv, struct cmd_token token); @@ -119,7 +119,7 @@ int build_pad1(tlv *tlv); int build_padn(tlv *tlv, size_t len); int build_neighbour_req(union tlv *tlv); int build_neighbour(tlv *tlv, struct in6_addr ip, short port); -int build_network_hash(tlv *tlv, struct list *data_list); +int build_network_hash(tlv *tlv, list *data_list); int build_network_state_req(tlv *tlv); int build_node_hash(tlv *tlv, long node_id, short seqno, char *data); int build_node_state_req(tlv *tlv, long node_id); diff --git a/src/tlv.o b/src/tlv.o new file mode 100644 index 0000000000000000000000000000000000000000..4bdf7c2702f6b770320093b5f1edd1e33912cf54 GIT binary patch literal 4744 zcmbtX?QdIG89#nW>m}K>DP>q~)n3357j2eJH!Vys`R4UnG9-|AMRdh+?CUs7YzO;h zP1crWau@Zg@fPt9&<_Y91bpuDC6)r&r=fmmkk}W#AXe0>8yl4>u`qtmx#u{yH}*cj zBi-}zJJ0hw&-0u&`}NWEnAhWBQatQMcF>b3V}am7JIR|#rm!cO-nbvQF%k(i9{FAk zHy-(yPwUO+XndPk60N(`zV#VIZ~P&!v#B?~ONa|D#)4)+gzYv^yb%-&tb zbjz1$UD)9~7j}x92m0D{CS`p(wH<=3Zar*U4d~X+F7qU>mpr=l;D9k@or>tzZ~$}{ zwU>7`Ipw`iijU3j1zDRZxJ6xfP_#l0CxU0z05dJ4O{c7f8SZx&K+3vfy+>JT6GXOr z#~4dnC4btQ=?6>EDjnw$QA)@S?V=spy$73!N4NH;wqXIPf3-;{o?CuInYKRAn{{u| z^4Vk7MP!-B5!81u_Ctj@nV`&d>9SxAHrGSjp zPPa()$4C+KrJdJaN?HG*W!xsx3?hE0S$A~nz3*A?f^e`~)WK`Ng8pc8`~;%c-gwkP zFZlKqlv*=+B9*_bH!pwn9c*6s@L<;$xIXMjTML2Wh?Ng<_bFqPEM%yi9UX}YL!}T2 zQP$Gv+8Zg+N?E7%8)=@Qemg^P1T-i!q-Bw#B-?$H{9s#D-g+O$?jOr2?5x>`k+dA= zhwtD0%+$6Q2NtWXTYHbCaq^9Qx)2cK>*uVydVUXKd3SwJAe?t-AZ`7fM%I|1ZTQVzB@B}xVx)PllMdu86`X6P%{2(<*MvhRr~p^fJEVj+h-=-iDbYsH z50v;^uM*W16_Y>#%vvAge*BGWAf5bJYWp$9{Rkm;l1_dkfyc%8Z%GN$yhVOAeWQxH zL4K_Fj4AQPk+d@7t@kQ%AaDp8wnM2t?vE)rULX#{x=wj%_$CxJYkQ;FzUvsiDRe(3 zU9h}O^Swp$HT^?Mbc5zwKcXpvjiZywlJ^(A%Am&Q9dgV&+Q(?E?hCF}!F4Ey6H5HD zD~IFA;pYia`q@7}>!jo32jcLEkNFORKzv~8BtAwr`C;*~BZomCJ{IVLKXC{@%8|qT z{T%PcZ(BLZzJSg#N4)&Z06U3~zXwibv=d$M7rWr2z=?knH3>g+sHxwH|2%NgUqem8 z_de=be4X^?fs_7i)FgcWqrQrd$0ha-KYzfQ0-qGPJ+XCn3 z3fNv3p1*d%KN37^^dkns&lc()@RI*6f%9_&{3+m_{QR2K7h9B{6(Yp-8q2d-dN@u+ zg3T_^FBY;uS#~@N|v*Iu+knL%t$#I`N7F zKPPa~?{(nx29S_G{X~~MKPC`DIGsU>ZxRS`<8pry{zZIJ|9w)1xb;tBKXk%py5LtF z_?KZQ`G4cUoqq0j!8Ng8$)6Jro)rg9cZ=lzxdV6df6@hiUhHq;KkeWtIB@5@zjxry zdH>?To%8k(F~rTUa+LA?AY9`}(uGfo{)`J>6a5Vrep~eA`Vu$i7x}&G(wFzvaWO9S z<^A-m3zzrPiVI&8LHyE%w*>x?8yERvvHEJ+%*~=UYj$0dt(viziA(f<55cP`qoe>gwqb|)OUvm1(N%9SRgv&G%MzZRf*G6q!*{1qw ze8l;`+9zO3^M4DUQ`W@%87GLg^q*`j9)62&>&Zn5)k$EC+$W+Oi1fb?}fCN z>rcb3DY#)${v;C%+YgjJw>@#X*PaNH^w>ZWu7F)#{>F5&-=s$ja>=gRrQ80$f0=cc literal 0 HcmV?d00001