1*00c7fec1SAndroid Build Coastguard Worker /*
2*00c7fec1SAndroid Build Coastguard Worker * Copyright 2008, The Android Open Source Project
3*00c7fec1SAndroid Build Coastguard Worker *
4*00c7fec1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*00c7fec1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*00c7fec1SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*00c7fec1SAndroid Build Coastguard Worker *
8*00c7fec1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*00c7fec1SAndroid Build Coastguard Worker *
10*00c7fec1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*00c7fec1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*00c7fec1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*00c7fec1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*00c7fec1SAndroid Build Coastguard Worker * limitations under the License.
15*00c7fec1SAndroid Build Coastguard Worker */
16*00c7fec1SAndroid Build Coastguard Worker
17*00c7fec1SAndroid Build Coastguard Worker #include <stdio.h>
18*00c7fec1SAndroid Build Coastguard Worker #include <stdarg.h>
19*00c7fec1SAndroid Build Coastguard Worker #include <string.h>
20*00c7fec1SAndroid Build Coastguard Worker #include <netinet/in.h>
21*00c7fec1SAndroid Build Coastguard Worker
22*00c7fec1SAndroid Build Coastguard Worker #include "dhcpmsg.h"
23*00c7fec1SAndroid Build Coastguard Worker
init_dhcp_msg(dhcp_msg * msg,int type,void * hwaddr,uint32_t xid)24*00c7fec1SAndroid Build Coastguard Worker static void *init_dhcp_msg(dhcp_msg *msg, int type, void *hwaddr, uint32_t xid)
25*00c7fec1SAndroid Build Coastguard Worker {
26*00c7fec1SAndroid Build Coastguard Worker uint8_t *x;
27*00c7fec1SAndroid Build Coastguard Worker
28*00c7fec1SAndroid Build Coastguard Worker memset(msg, 0, sizeof(dhcp_msg));
29*00c7fec1SAndroid Build Coastguard Worker
30*00c7fec1SAndroid Build Coastguard Worker msg->op = OP_BOOTREQUEST;
31*00c7fec1SAndroid Build Coastguard Worker msg->htype = HTYPE_ETHER;
32*00c7fec1SAndroid Build Coastguard Worker msg->hlen = 6;
33*00c7fec1SAndroid Build Coastguard Worker msg->hops = 0;
34*00c7fec1SAndroid Build Coastguard Worker
35*00c7fec1SAndroid Build Coastguard Worker msg->flags = htons(FLAGS_BROADCAST);
36*00c7fec1SAndroid Build Coastguard Worker
37*00c7fec1SAndroid Build Coastguard Worker msg->xid = xid;
38*00c7fec1SAndroid Build Coastguard Worker
39*00c7fec1SAndroid Build Coastguard Worker memcpy(msg->chaddr, hwaddr, 6);
40*00c7fec1SAndroid Build Coastguard Worker
41*00c7fec1SAndroid Build Coastguard Worker x = msg->options;
42*00c7fec1SAndroid Build Coastguard Worker
43*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_COOKIE1;
44*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_COOKIE2;
45*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_COOKIE3;
46*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_COOKIE4;
47*00c7fec1SAndroid Build Coastguard Worker
48*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_MESSAGE_TYPE;
49*00c7fec1SAndroid Build Coastguard Worker *x++ = 1;
50*00c7fec1SAndroid Build Coastguard Worker *x++ = type;
51*00c7fec1SAndroid Build Coastguard Worker
52*00c7fec1SAndroid Build Coastguard Worker return x;
53*00c7fec1SAndroid Build Coastguard Worker }
54*00c7fec1SAndroid Build Coastguard Worker
init_dhcp_discover_msg(dhcp_msg * msg,void * hwaddr,uint32_t xid)55*00c7fec1SAndroid Build Coastguard Worker int init_dhcp_discover_msg(dhcp_msg *msg, void *hwaddr, uint32_t xid)
56*00c7fec1SAndroid Build Coastguard Worker {
57*00c7fec1SAndroid Build Coastguard Worker uint8_t *x;
58*00c7fec1SAndroid Build Coastguard Worker
59*00c7fec1SAndroid Build Coastguard Worker x = init_dhcp_msg(msg, DHCPDISCOVER, hwaddr, xid);
60*00c7fec1SAndroid Build Coastguard Worker
61*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_PARAMETER_LIST;
62*00c7fec1SAndroid Build Coastguard Worker *x++ = 4;
63*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_SUBNET_MASK;
64*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_GATEWAY;
65*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_DNS;
66*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_BROADCAST_ADDR;
67*00c7fec1SAndroid Build Coastguard Worker
68*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_END;
69*00c7fec1SAndroid Build Coastguard Worker
70*00c7fec1SAndroid Build Coastguard Worker return DHCP_MSG_FIXED_SIZE + (x - msg->options);
71*00c7fec1SAndroid Build Coastguard Worker }
72*00c7fec1SAndroid Build Coastguard Worker
init_dhcp_request_msg(dhcp_msg * msg,void * hwaddr,uint32_t xid,uint32_t ipaddr,uint32_t serveraddr)73*00c7fec1SAndroid Build Coastguard Worker int init_dhcp_request_msg(dhcp_msg *msg, void *hwaddr, uint32_t xid,
74*00c7fec1SAndroid Build Coastguard Worker uint32_t ipaddr, uint32_t serveraddr)
75*00c7fec1SAndroid Build Coastguard Worker {
76*00c7fec1SAndroid Build Coastguard Worker uint8_t *x;
77*00c7fec1SAndroid Build Coastguard Worker
78*00c7fec1SAndroid Build Coastguard Worker x = init_dhcp_msg(msg, DHCPREQUEST, hwaddr, xid);
79*00c7fec1SAndroid Build Coastguard Worker
80*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_PARAMETER_LIST;
81*00c7fec1SAndroid Build Coastguard Worker *x++ = 4;
82*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_SUBNET_MASK;
83*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_GATEWAY;
84*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_DNS;
85*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_BROADCAST_ADDR;
86*00c7fec1SAndroid Build Coastguard Worker
87*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_REQUESTED_IP;
88*00c7fec1SAndroid Build Coastguard Worker *x++ = 4;
89*00c7fec1SAndroid Build Coastguard Worker memcpy(x, &ipaddr, 4);
90*00c7fec1SAndroid Build Coastguard Worker x += 4;
91*00c7fec1SAndroid Build Coastguard Worker
92*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_SERVER_ID;
93*00c7fec1SAndroid Build Coastguard Worker *x++ = 4;
94*00c7fec1SAndroid Build Coastguard Worker memcpy(x, &serveraddr, 4);
95*00c7fec1SAndroid Build Coastguard Worker x += 4;
96*00c7fec1SAndroid Build Coastguard Worker
97*00c7fec1SAndroid Build Coastguard Worker *x++ = OPT_END;
98*00c7fec1SAndroid Build Coastguard Worker
99*00c7fec1SAndroid Build Coastguard Worker return DHCP_MSG_FIXED_SIZE + (x - msg->options);
100*00c7fec1SAndroid Build Coastguard Worker }
101