Exemple #1
0
int
recv_address (int code, void *closure,
	      struct sockaddr_in *dest, struct sockaddr_in *from,
	      struct ip *ip, icmphdr_t * icmp, int datalen)
{
  switch (code)
    {
    case PEV_RESPONSE:
    case PEV_DUPLICATE:
      print_address (code == PEV_DUPLICATE,
		     closure, dest, from, ip, icmp, datalen);
      break;
    case PEV_NOECHO:;
      print_icmp_header (from, ip, icmp, datalen);
    }
  return 0;
}
Exemple #2
0
/*
 * Process a packet on the transport layer. 
 *
 * @param recvsize: size of the captured data 
 * @param packet: packet capture data target structure
 * @param raw: packet data at layer 4 entry
 */
bool process_transport_layer(size_t recvsize, struct packet* packet, byte* raw)
{
	// switch over layer 4 protocol
	switch( packet->transport_layer_code )
	{
		break;case PRO_ICMP:
			if( recvsize < sizeof(struct icmphdr) )
			{
				printf("ERROR Received data indicates an ICMP header but it is incomplete\n");
				return false;
			}
			extract_icmp_header( packet, raw );
			print_icmp_header( packet );

		break;case PRO_TCP:
			if( recvsize < sizeof(struct tcphdr) )
			{
				printf("ERROR Received data indicates a TCP header but it is incomplete\n");
				return false;
			}
			extract_tcp_header( packet, raw );
			print_tcp_header( packet );

		break;case PRO_UDP:
			if( recvsize < sizeof(struct udphdr) )
			{
				printf("ERROR Received data indicates an UDP header but it is incomplete\n");
				return false;
			}
			extract_udp_header( packet, raw );
			print_udp_header( packet );

		break;case UNKNOWN_TRANSPORT_PROTOCOL:
			printf("Unknown transport layer protocol.\n");
			return false;
	}

	return true;
}