1/*
2 * Copyright (C) 2010 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
17package android.net.dhcp;
18
19import java.net.Inet4Address;
20import java.nio.ByteBuffer;
21
22/**
23 * This class implements the DHCP-OFFER packet.
24 */
25class DhcpOfferPacket extends DhcpPacket {
26    /**
27     * The IP address of the server which sent this packet.
28     */
29    private final Inet4Address mSrcIp;
30
31    /**
32     * Generates a OFFER packet with the specified parameters.
33     */
34    DhcpOfferPacket(int transId, short secs, boolean broadcast, Inet4Address serverAddress,
35                    Inet4Address clientIp, Inet4Address yourIp, byte[] clientMac) {
36        super(transId, secs, clientIp, yourIp, INADDR_ANY, INADDR_ANY, clientMac, broadcast);
37        mSrcIp = serverAddress;
38    }
39
40    public String toString() {
41        String s = super.toString();
42        String dnsServers = ", DNS servers: ";
43
44        if (mDnsServers != null) {
45            for (Inet4Address dnsServer: mDnsServers) {
46                dnsServers += dnsServer + " ";
47            }
48        }
49
50        return s + " OFFER, ip " + mYourIp + ", mask " + mSubnetMask +
51                dnsServers + ", gateways " + mGateways +
52                " lease time " + mLeaseTime + ", domain " + mDomainName;
53    }
54
55    /**
56     * Fills in a packet with the specified OFFER attributes.
57     */
58    public ByteBuffer buildPacket(int encap, short destUdp, short srcUdp) {
59        ByteBuffer result = ByteBuffer.allocate(MAX_LENGTH);
60        Inet4Address destIp = mBroadcast ? INADDR_BROADCAST : mYourIp;
61        Inet4Address srcIp = mBroadcast ? INADDR_ANY : mSrcIp;
62
63        fillInPacket(encap, destIp, srcIp, destUdp, srcUdp, result,
64            DHCP_BOOTREPLY, mBroadcast);
65        result.flip();
66        return result;
67    }
68
69    /**
70     * Adds the optional parameters to the server-generated OFFER packet.
71     */
72    void finishPacket(ByteBuffer buffer) {
73        addTlv(buffer, DHCP_MESSAGE_TYPE, DHCP_MESSAGE_TYPE_OFFER);
74        addTlv(buffer, DHCP_SERVER_IDENTIFIER, mServerIdentifier);
75        addTlv(buffer, DHCP_LEASE_TIME, mLeaseTime);
76
77        // the client should renew at 1/2 the lease-expiry interval
78        if (mLeaseTime != null) {
79            addTlv(buffer, DHCP_RENEWAL_TIME,
80                Integer.valueOf(mLeaseTime.intValue() / 2));
81        }
82
83        addTlv(buffer, DHCP_SUBNET_MASK, mSubnetMask);
84        addTlv(buffer, DHCP_ROUTER, mGateways);
85        addTlv(buffer, DHCP_DOMAIN_NAME, mDomainName);
86        addTlv(buffer, DHCP_BROADCAST_ADDRESS, mBroadcastAddress);
87        addTlv(buffer, DHCP_DNS_SERVER, mDnsServers);
88        addTlvEnd(buffer);
89    }
90}
91