1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/*
29 * Copyright (c) 1982, 1986, 1993
30 *      The Regents of the University of California.  All rights reserved.
31 */
32
33#include <libsa/types.h>
34#include <libkern/OSByteOrder.h>   /* OSSwap functions */
35
36#define     ETHERMTU        1500
37#define     ETHERHDRSIZE    14
38#define     ETHERCRC        4
39#define     KDP_MAXPACKET   (ETHERHDRSIZE + ETHERMTU + ETHERCRC)
40
41struct in_addr {
42        u_long s_addr;
43};
44
45struct ether_addr {
46        u_char ether_addr_octet[6];
47};
48
49typedef struct ether_addr enet_addr_t;
50
51extern struct ether_addr kdp_get_mac_addr(void);
52unsigned int  kdp_get_ip_address(void);
53
54struct ipovly {
55        caddr_t ih_next, ih_prev;       /* for protocol sequence q's */
56        u_char  ih_x1;                  /* (unused) */
57        u_char  ih_pr;                  /* protocol */
58        short   ih_len;                 /* protocol length */
59        struct  in_addr ih_src;         /* source internet address */
60        struct  in_addr ih_dst;         /* destination internet address */
61};
62
63struct udphdr {
64        u_short uh_sport;               /* source port */
65        u_short uh_dport;               /* destination port */
66        short   uh_ulen;                /* udp length */
67        u_short uh_sum;                 /* udp checksum */
68};
69
70struct  udpiphdr {
71        struct  ipovly ui_i;            /* overlaid ip structure */
72        struct  udphdr ui_u;            /* udp header */
73};
74#define ui_next         ui_i.ih_next
75#define ui_prev         ui_i.ih_prev
76#define ui_x1           ui_i.ih_x1
77#define ui_pr           ui_i.ih_pr
78#define ui_len          ui_i.ih_len
79#define ui_src          ui_i.ih_src
80#define ui_dst          ui_i.ih_dst
81#define ui_sport        ui_u.uh_sport
82#define ui_dport        ui_u.uh_dport
83#define ui_ulen         ui_u.uh_ulen
84#define ui_sum          ui_u.uh_sum
85
86struct ip {
87	union {
88		u_long ip_w;
89		struct {
90			unsigned int
91#ifdef __LITTLE_ENDIAN__
92        		ip_xhl:4,	/* header length */
93                	ip_xv:4,		/* version */
94        		ip_xtos:8,	/* type of service */
95        		ip_xlen:16;	/* total length */
96#endif
97#ifdef __BIG_ENDIAN__
98        		ip_xv:4,                 /* version */
99                	ip_xhl:4,                /* header length */
100        		ip_xtos:8,               /* type of service */
101        		ip_xlen:16;               /* total length */
102#endif
103		} ip_x;
104	} ip_vhltl;
105        u_short ip_id;                  /* identification */
106        short   ip_off;                 /* fragment offset field */
107#define IP_DF 0x4000                    /* dont fragment flag */
108#define IP_MF 0x2000                    /* more fragments flag */
109#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
110        u_char  ip_ttl;                 /* time to live */
111        u_char  ip_p;                   /* protocol */
112        u_short ip_sum;                 /* checksum */
113        struct  in_addr ip_src,ip_dst;  /* source and dest address */
114};
115#define ip_v   ip_vhltl.ip_x.ip_xv
116#define ip_hl  ip_vhltl.ip_x.ip_xhl
117#define ip_tos ip_vhltl.ip_x.ip_xtos
118#define ip_len ip_vhltl.ip_x.ip_xlen
119
120#define    IPPROTO_UDP     17
121#define    IPVERSION       4
122
123struct  ether_header {
124        u_char  ether_dhost[6];
125        u_char  ether_shost[6];
126        u_short ether_type;
127};
128
129typedef struct ether_header ether_header_t;
130
131#define ETHERTYPE_IP       0x0800  /* IP protocol */
132
133#define ntohs(x)           OSSwapBigToHostInt16(x)
134#define ntohl(x)           OSSwapBigToHostInt32(x)
135#define htons(x)           OSSwapHostToBigInt16(x)
136#define htonl(x)           OSSwapHostToBigInt32(x)
137/*
138 * Ethernet Address Resolution Protocol.
139 *
140 * See RFC 826 for protocol description.  Structure below is adapted
141 * to resolving internet addresses.  Field names used correspond to
142 * RFC 826.
143 */
144
145#define ETHERTYPE_ARP          0x0806  /* Addr. resolution protocol */
146
147struct  arphdr {
148  u_short ar_hrd;         /* format of hardware address */
149#define ARPHRD_ETHER    1       /* ethernet hardware format */
150#define ARPHRD_FRELAY   15      /* frame relay hardware format */
151  u_short ar_pro;         /* format of protocol address */
152  u_char  ar_hln;         /* length of hardware address */
153  u_char  ar_pln;         /* length of protocol address */
154  u_short ar_op;          /* one of: */
155#define ARPOP_REQUEST   1       /* request to resolve address */
156#define ARPOP_REPLY     2       /* response to previous request */
157#define ARPOP_REVREQUEST 3      /* request protocol address given hardware */
158#define ARPOP_REVREPLY  4       /* response giving protocol address */
159#define ARPOP_INVREQUEST 8      /* request to identify peer */
160#define ARPOP_INVREPLY  9       /* response identifying peer */
161};
162
163#define ETHER_ADDR_LEN 6
164
165struct  ether_arp {
166  struct  arphdr ea_hdr;  /* fixed-size header */
167  u_char  arp_sha[ETHER_ADDR_LEN];        /* sender hardware address */
168  u_char  arp_spa[4];     /* sender protocol address */
169  u_char  arp_tha[ETHER_ADDR_LEN];        /* target hardware address */
170  u_char  arp_tpa[4];     /* target protocol address */
171};
172#define arp_hrd ea_hdr.ar_hrd
173#define arp_pro ea_hdr.ar_pro
174#define arp_hln ea_hdr.ar_hln
175#define arp_pln ea_hdr.ar_pln
176#define arp_op  ea_hdr.ar_op
177