OSDN Git Service

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