#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>

#ifdef LINUX

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#include <linux/types.h>

#include <netdb.h>
#include <linux/errqueue.h>

#include <netinet/ip6.h>
#include <netinet/icmp6.h>

#include <arpa/inet.h>

#endif /* LINUX */

#ifdef RAWSOCKET

#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip6.h>
#include <netinet/icmp6.h>
#include <netinet/udp.h>

#include <unistd.h>
#include <netdb.h>
#include <string.h>

#endif /* RAWSOCKET */

#define DEFAULT_MTU 1500

struct probehdr {
    struct timeval tv;
    char pad[DEFAULT_MTU];
};

struct mtureply {
    int mtu;
    char addr[INET6_ADDRSTRLEN];
    u_int8_t ee_type;
    u_int8_t ee_code;
};

struct icmpv6responsefilter {
   struct in6_addr src, dst;
   unsigned short srcport, dstport;
};

int match_icmpv6_response(struct ip6_hdr *, struct icmpv6responsefilter *);
struct icmpv6responsefilter *getfilter(int);
struct mtureply recvmtu(int);
int recv_init(int);
int wait_for_reply(int, struct icmpv6responsefilter *);


syntax highlighted by Code2HTML, v. 0.9.1