#include <libkern/OSByteOrder.h>
#define ETHERMTU 1500
#define ETHERHDRSIZE 14
#define ETHERCRC 4
#define KDP_MAXPACKET (ETHERHDRSIZE + ETHERMTU + ETHERCRC)
struct in_addr {
u_long s_addr;
};
struct ether_addr {
u_char ether_addr_octet[6];
};
typedef struct ether_addr enet_addr_t;
struct ipovly {
caddr_t ih_next, ih_prev;
u_char ih_x1;
u_char ih_pr;
short ih_len;
struct in_addr ih_src;
struct in_addr ih_dst;
};
struct udphdr {
u_short uh_sport;
u_short uh_dport;
short uh_ulen;
u_short uh_sum;
};
struct udpiphdr {
struct ipovly ui_i;
struct udphdr ui_u;
};
#define ui_next ui_i.ih_next
#define ui_prev ui_i.ih_prev
#define ui_x1 ui_i.ih_x1
#define ui_pr ui_i.ih_pr
#define ui_len ui_i.ih_len
#define ui_src ui_i.ih_src
#define ui_dst ui_i.ih_dst
#define ui_sport ui_u.uh_sport
#define ui_dport ui_u.uh_dport
#define ui_ulen ui_u.uh_ulen
#define ui_sum ui_u.uh_sum
struct ip {
union {
u_long ip_w;
struct {
unsigned int
#if _BIG_ENDIAN == __LITTLE_ENDIAN__
ip_xhl:4,
ip_xv:4,
ip_xtos:8,
ip_xlen:16;
#endif
#if _BIG_ENDIAN == __BIG_ENDIAN__
ip_xv:4,
ip_xhl:4,
ip_xtos:8,
ip_xlen:16;
#endif
} ip_x;
} ip_vhltl;
u_short ip_id;
short ip_off;
#define IP_DF 0x4000
#define IP_MF 0x2000
#define IP_OFFMASK 0x1fff
u_char ip_ttl;
u_char ip_p;
u_short ip_sum;
struct in_addr ip_src,ip_dst;
};
#define ip_v ip_vhltl.ip_x.ip_xv
#define ip_hl ip_vhltl.ip_x.ip_xhl
#define ip_tos ip_vhltl.ip_x.ip_xtos
#define ip_len ip_vhltl.ip_x.ip_xlen
#define IPPROTO_UDP 17
#define IPVERSION 4
struct ether_header {
u_char ether_dhost[6];
u_char ether_shost[6];
u_short ether_type;
};
typedef struct ether_header ether_header_t;
#define ETHERTYPE_IP 0x0800
#define ntohs(x) OSSwapBigToHostInt16(x)
#define htons(x) OSSwapHostToBigInt16(x)