Im working with libpcap and I want to print the
protocol field of the IP header and the
type field of the ICMP header. Here the important code:
Code:
#include <pcap.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
struct ip {
u_int8_t ip_vhl; /* header length, version */
#define IP_V(ip) (((ip)->ip_vhl & 0xf0) >> 4)
#define IP_HL(ip) ((ip)->ip_vhl & 0x0f)
u_int8_t ip_tos; /* type of service */
u_int16_t ip_len; /* total length */
u_int16_t ip_id; /* identification */
u_int16_t ip_off; /* fragment offset field */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_int8_t ip_ttl; /* time to live */
u_int8_t ip_p; /* protocol */
u_int16_t ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};
struct icmp {
u_int8_t icmp_type; /* type of message, see below */
u_int8_t icmp_code; /* type sub code */
u_int16_t icmp_cksum; /* ones complement cksum of struct */
};
void
got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
static int count = 1; /* packet counter */
struct ip *ip;
struct icmp *icmp;
printf("\nPacket number %d:\n", count);
count++;
printf("\nProtocol field: ");
switch(ip->ip_p)
{
case IPPROTO_IP : printf("Dummy protocol for TCP");
break;
case IPPROTO_ICMP : printf("ICMP");
break;
case IPPROTO_TCP : printf("TCP");
break;
case IPPROTO_UDP : printf("UDP");
break;
default : printf("???");
break;
}
fprintf(stdout," ICMP type: %d\n", icmp->icmp_type);
}
I call this function in my program in main() with :
Code:
pcap_loop(handle, num_packets, got_packet, NULL);
When I start this program I do a ping to my gateway 192.168.1.1 in another window and I cant get the right values for protocol field and type field.
What I need to change or to add in order to get the right values?
Extra information:
When I do a ping to my router I think that I should get:
Protocol field: ICMP
ICMP type: 0 or 8