/* @brief Parses a given, complete packet. * @param packet: The actual packet to be parsed. * @param myPack: A struct that will contain information about the packet. */ void parse_packet(uint8_t *packet, packet_info* myPack){ byte_buf *tempRequest = create_bytebuf(PACKET_LENGTH); mmemclear(tempRequest); memcpy(tempRequest->buf, packet, PACKET_LENGTH); mmemmove(myPack->magicNumber, tempRequest, 2); mmemmove(myPack->versionNumber, tempRequest, 1); /* if(magicNumber != 15441 && versionNumber != 1){ //Drop the packet } */ mmemmove(myPack->packetType, tempRequest, 1); mmemmove(myPack->headerLength, tempRequest, 2); mmemmove(myPack->totalPacketLength, tempRequest, 2); mmemmove(myPack->sequenceNumber, tempRequest, 4); mmemmove(myPack->ackNumber, tempRequest, 4); int packetType = binary2int(myPack->packetType, 1); if(packetType == 0 || packetType == 1){ mmemmove(myPack->numberHashes, tempRequest, 1); mmemmove(myPack->padding, tempRequest, 3); } int headerLength = binary2int(myPack->headerLength, 2); int totalPacketLength = binary2int(myPack->totalPacketLength, 2); mmemmove(myPack->body, tempRequest, totalPacketLength - headerLength); delete_bytebuf(tempRequest); }
void leading_space_tab() { int row,len,nlen,i,ll,tabno,ofs; char *ss; for(row=0;row<Lines;row++) { if (!(len=edbf[row].len)) continue; ss=edbf[row].cstr; for(ll=0;ll<len && ss[ll]==' ';ll++); if (ll<tab_width) continue; tabno=ll/tab_width; ofs=tabno+(ll%tab_width); mmemmove(ss+ofs,ss+ll,len-ll); for(i=0;i<tabno;ss[i++]=9); if ((ss=mrealloc(ss,nlen=len-ll+ofs,"leading_space_tab"))==NULL) return; edbf[row].cstr=ss; edbf[row].len=nlen; } }
void print_packet(uint8_t* packet, int i) { packet_info myPack = {0}; byte_buf *tempRequest = create_bytebuf(PACKET_LENGTH); mmemclear(tempRequest); memcpy(tempRequest->buf, packet, PACKET_LENGTH); mmemmove(myPack.magicNumber, tempRequest, 2); mmemmove(myPack.versionNumber, tempRequest, 1); mmemmove(myPack.packetType, tempRequest, 1); mmemmove(myPack.headerLength, tempRequest, 2); mmemmove(myPack.totalPacketLength, tempRequest, 2); mmemmove(myPack.sequenceNumber, tempRequest, 4); mmemmove(myPack.ackNumber, tempRequest, 4); int type = binary2int(myPack.packetType, 1); int hlen = binary2int(myPack.headerLength, 2); int plen = binary2int(myPack.totalPacketLength, 2); if(type == 0 || type == 1){ mmemmove(myPack.numberHashes, tempRequest, 1); mmemmove(myPack.padding, tempRequest, 3); } mmemmove(myPack.body, tempRequest, plen - hlen); int numh = binary2int(myPack.numberHashes, 1); char typestr[10]; switch (type) { case 0: sprintf(typestr, "WHOHAS"); break; case 1: sprintf(typestr, "IHAVE"); break; case 2: sprintf(typestr, "GET"); break; case 3: sprintf(typestr, "DATA"); break; case 4: sprintf(typestr, "ACK"); break; case 5: sprintf(typestr, "DENIED"); break; default: sprintf(typestr, "DEFAULT"); break; } printf("\n###############################\n"); if(i == SEND) printf("Sending packet with contents:\n"); if(i == RECV) printf("Receiving packet with contents:\n"); printf("Magic Number: %d\n", binary2int(myPack.magicNumber, 2)); printf("Version Number: %d\n", binary2int(myPack.versionNumber, 1)); printf("Packet Type : %s\n", typestr); printf("Header Len : %d\n", hlen); printf("Packet Len : %d\n", plen); printf("Seq No : %d\n", binary2int(myPack.sequenceNumber , 4)); printf("Ack No : %d\n", binary2int(myPack.ackNumber , 4)); printf("Hash No : %d\n", numh); char hash[45] = {0}; for(int i = 0; i < numh; i++) { binary2hex(myPack.body + 20 * i, 20, hash); printf("Hash %d: %s \n", i, hash); bzero(hash, 45); } if(type == 2) // GET { binary2hex(myPack.body, 20, hash); printf("Hash %d: %s \n", i, hash); bzero(hash, 45); } printf("###############################\n\n"); delete_bytebuf(tempRequest); }