示例#1
0
/* @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);
}
示例#2
0
文件: misc.c 项目: 8l/ted
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;
}
}
示例#3
0
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);
}