#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