xref: /aosp_15_r20/system/core/libnetutils/dhcpmsg.c (revision 00c7fec1bb09f3284aad6a6f96d2f63dfc3650ad)
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