Package ru.bitel.bgbilling.kernel.network.dhcp

# Class DhcpPacket

java.lang.Object
ru.bitel.bgbilling.kernel.network.dhcp.DhcpPacket

All Implemented Interfaces:
  `Comparator<DhcpOption>`

public final class DhcpPacket extends Object implements Comparator<DhcpOption>

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `static class`
  `DhcpPacket.DhcpPacketOption<T>`
  Опция, которой оперирует биллинг для поиска агентского устройства, сервиса.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `byte[]`
  `chaddr`
  Client HW address.
  `byte[]`
  `ciaddr`
  Client IP.
  `static final int`
  `DHCP_ACK`
  Code for DHCPACK Message
  `static final int`
  `DHCP_DECLINE`
  Code for DHCPDECLINE Message
  `static final int`
  `DHCP_DISCOVER`
  Code for DHCPDISCOVER Message
  `static final int`
  `DHCP_INFORM`
  Code for DHCPINFORM Message
  `static final int`
  `DHCP_NAK`
  Code for DHCPNAK Message
  `static final int`
  `DHCP_OFFER`
  Code for DHCPOFFER Message
  `static final int`
  `DHCP_RELEASE`
  Code for DHCPRELEASE Message
  `static final int`
  `DHCP_REQUEST`
  Code for DHCPREQUEST Message
  `byte[]`
  `file`
  Boot file name.
  `static short`
  `FLAG_BROADCAST`
  Маска для поля flags, устанавливающего способ отправки dhcp-пакета как broadcast (всем).
  `short`
  `flags`
  Flags.
  `byte[]`
  `giaddr`
  Relay agent IP.
  `byte`
  `hlen`
  Hardware address length.
  `byte`
  `hops`
  Hw options.
  `byte`
  `htype`
  HW address Type.
  `byte`
  `messageType`
  Тип DHCP-пакета.
  `byte`
  `op`
  Op code.
  `static final byte`
  `OP_BOOT_REQUEST`
  Тип DHCP-сообщения - от клиента к серверу
  `static final byte`
  `OP_BOOT_RESPONSE`
  Тип DHCP-сообщения - от сервера к клиенту
  `static final byte`
  `OPTION_AGENT_INFORMATION`
  DHCP-опция 82.
  `static final byte`
  `OPTION_CLIENT_IDENTIDIER`
  DHCP-опция 61.
  `static final byte`
  `OPTION_COOKIE_SERVER`
  DHCP-опция 8.
  `static final byte`
  `OPTION_DHCP_MAX_MSG_SIZE`
  DHCP-опция 57.
  `static final byte`
  `OPTION_DOMAIN_NAME`
  DHCP-опция 15.
  `static final byte`
  `OPTION_DOMAIN_NAME_SERVER`
  DHCP-опция 6.
  `static final byte`
  `OPTION_HOST_NAME`
  DHCP-опция 12.
  `static final byte`
  `OPTION_IP_ADDRESS_LEASE_TIME`
  DHCP-опция 51.
  `static final byte`
  `OPTION_LOG_SERVER`
  DHCP-опция 7.
  `static final byte`
  `OPTION_LPR_SERVER`
  DHCP-опция 9.
  `static String[]`
  `OPTION_NAME`
  `static final byte`
  `OPTION_NAME_SERVER`
  DHCP-опция 5.
  `static final byte`
  `OPTION_PARAMETER_REQUEST_LIST`
  DHCP-опция 55.
  `static final byte`
  `OPTION_REBINDING_TIME_VALUE`
  DHCP-опция 59.
  `static final byte`
  `OPTION_RENEWAL_TIME_VALUE`
  DHCP-опция 58.
  `static final byte`
  `OPTION_REQUESTED_IP_ADDRESS`
  DHCP-опция 50.
  `static final byte`
  `OPTION_ROUTER`
  DHCP-опция 3.
  `static final byte`
  `OPTION_SERVER_IDENTIFIER`
  DHCP-опция 54.
  `static final byte`
  `OPTION_SUBNET_MASK`
  DHCP-опция 1.
  `static final byte`
  `OPTION_TIME_OFFSET`
  DHCP-опция 2.
  `static final byte`
  `OPTION_TIME_SERVER`
  DHCP-опция 4.
  `static final byte`
  `OPTION_VENDOR_CLASS_IDENTIDIER`
  Option 60 (Vendor class identifier) https://tools.ietf.org/html/rfc2132#section-9.13
  `short`
  `secs`
  Elapsed time from trying to boot.
  `byte[]`
  `siaddr`
  Server IP.
  `byte[]`
  `sname`
  Optional server host name.
  `int`
  `xid`
  Transaction id.
  `byte[]`
  `yiaddr`
  Your client IP.
  `static final byte`
  `ZERO`
  Константа для нулевого значения байта

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `DhcpPacket()`
  Конструктор пустого пакета.
  `DhcpPacket(ByteBuffer request)`
  Конструктор пакета - запроса.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `clearSubOptions()`
  Очистка подопций 82й опции.
  `final int`
  `compare(DhcpOption o1, DhcpOption o2)`
  Сравнение опций в зависимости от их "веса"
  `final DhcpPacket`
  `createResponse()`
  Создание ответного dhcp-пакета на dhcp-запрос на основании данных запроса.
  `final DhcpOption`
  `getOption(byte code)`
  `<O> O`
  `getOption(DhcpPacket.DhcpPacketOption<O> option)`
  Получение опции(атрибута) из пакета.
  `<O> O`
  `getOption(DhcpPacket.DhcpPacketOption<O> option, O value)`
  Получение опции(атрибута) из пакета.
  `final DhcpOption`
  `getSubOption(byte code)`
  `boolean`
  `haveSubOptions()`
  Возвращает наличие Options.82 в запросе.
  `final boolean`
  `isClientAddressSet()`
  Проверка на заполненность поля `ciaddr`
  `final boolean`
  `isFromRelayAgent()`
  Проверка, пришел ли dhcp-запрос от dhcp-relay агента, ретранслировавшего dhcp-запрос от абонента.
  `static final boolean`
  `isNil(byte[] b)`
  Проверка на незаполненность dhcp-поля, представленного массивом байтов.
  `static boolean`
  `isRenewRequest(DhcpPacket request)`
  Првоеряет, является ли данный dhcp-запрос renew-запросом.
  `void`
  `serialize(ByteBuffer bb)`
  Сериализация dhcp-пакета в последовательность байт.
  `final void`
  `setOption(byte code, byte[] value)`
  Установка значения dhcp-опции.
  `final void`
  `setOption(byte code, String stringValue)`
  `final void`
  `setOption(DhcpOption option)`
  Установка значения опции в dhcp-пакет.
  `<O> void`
  `setOption(DhcpPacket.DhcpPacketOption<O> option, O value)`
  Установка опции в пакет.
  `final void`
  `setSubOption(byte code, byte[] value)`
  `final void`
  `setSubOption(byte code, String stringValue)`
  `final void`
  `setSubOption(DhcpOption option)`
  `String`
  `toString()`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

  ### Methods inherited from interface java.util.Comparator

  `equals, reversed, thenComparing, thenComparing, thenComparing, thenComparingDouble, thenComparingInt, thenComparingLong`

- ## Field Details

  - ### ZERO

    public static final byte ZERO
    Константа для нулевого значения байта
    See Also:
      - Constant Field Values

  - ### FLAG_BROADCAST

    public static short FLAG_BROADCAST
    Маска для поля flags, устанавливающего способ отправки dhcp-пакета как broadcast (всем). В противовес unicast - одному.

  - ### OP_BOOT_REQUEST

    public static final byte OP_BOOT_REQUEST
    Тип DHCP-сообщения - от клиента к серверу
    See Also:
      - Constant Field Values

  - ### OP_BOOT_RESPONSE

    public static final byte OP_BOOT_RESPONSE
    Тип DHCP-сообщения - от сервера к клиенту
    See Also:
      - Constant Field Values

  - ### DHCP_DISCOVER

    public static final int DHCP_DISCOVER
    Code for DHCPDISCOVER Message
    See Also:
      - Constant Field Values

  - ### DHCP_OFFER

    public static final int DHCP_OFFER
    Code for DHCPOFFER Message
    See Also:
      - Constant Field Values

  - ### DHCP_REQUEST

    public static final int DHCP_REQUEST
    Code for DHCPREQUEST Message
    See Also:
      - Constant Field Values

  - ### DHCP_DECLINE

    public static final int DHCP_DECLINE
    Code for DHCPDECLINE Message
    See Also:
      - Constant Field Values

  - ### DHCP_ACK

    public static final int DHCP_ACK
    Code for DHCPACK Message
    See Also:
      - Constant Field Values

  - ### DHCP_NAK

    public static final int DHCP_NAK
    Code for DHCPNAK Message
    See Also:
      - Constant Field Values

  - ### DHCP_RELEASE

    public static final int DHCP_RELEASE
    Code for DHCPRELEASE Message
    See Also:
      - Constant Field Values

  - ### DHCP_INFORM

    public static final int DHCP_INFORM
    Code for DHCPINFORM Message
    See Also:
      - Constant Field Values

  - ### OPTION_SUBNET_MASK

    public static final byte OPTION_SUBNET_MASK
    DHCP-опция 1. Маска подсети, из которой получен адрес. IP-адрес в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_TIME_OFFSET

    public static final byte OPTION_TIME_OFFSET
    DHCP-опция 2. Задает разницу во времени (в секундах) в подсети клиента по сравнению с Универсальным скоординированным временем (UTC). 32-разрядное целое число
    See Also:
      - Constant Field Values

  - ### OPTION_ROUTER

    public static final byte OPTION_ROUTER
    DHCP-опция 3. Список IP-адресов шлюзов по умолчанию. Один или несколько IP-адресов в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_TIME_SERVER

    public static final byte OPTION_TIME_SERVER
    DHCP-опция 4. Список IP-адресов серверов времени. Один или несколько IP-адресов в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_NAME_SERVER

    public static final byte OPTION_NAME_SERVER
    DHCP-опция 5. Список IP-адресов серверов имен. Один или несколько IP-адресов в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_DOMAIN_NAME_SERVER

    public static final byte OPTION_DOMAIN_NAME_SERVER
    DHCP-опция 6. Список IP-адресов серверов DNS. Один или несколько IP-адресов в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_LOG_SERVER

    public static final byte OPTION_LOG_SERVER
    DHCP-опция 7. Список IP-адресов серверов протоколов. Один или несколько IP-адресов в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_COOKIE_SERVER

    public static final byte OPTION_COOKIE_SERVER
    DHCP-опция 8. Список IP-адресов серверов cookie. Один или несколько IP-адресов в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_LPR_SERVER

    public static final byte OPTION_LPR_SERVER
    DHCP-опция 9. Список IP-адресов серверов LPR. Один или несколько IP-адресов в десятичном формате с точками
    See Also:
      - Constant Field Values

  - ### OPTION_HOST_NAME

    public static final byte OPTION_HOST_NAME
    DHCP-опция 12. Имя хоста клиента. Строка ASCII
    See Also:
      - Constant Field Values

  - ### OPTION_DOMAIN_NAME

    public static final byte OPTION_DOMAIN_NAME
    DHCP-опция 15. Имя домена DNS по умолчанию. Строка ASCII
    See Also:
      - Constant Field Values

  - ### OPTION_REQUESTED_IP_ADDRESS

    public static final byte OPTION_REQUESTED_IP_ADDRESS
    DHCP-опция 50. IP-адрес, запрашиваемый клиентом
    See Also:
      - Constant Field Values

  - ### OPTION_IP_ADDRESS_LEASE_TIME

    public static final byte OPTION_IP_ADDRESS_LEASE_TIME
    DHCP-опция 51. Время выделения для возвращаемого адреса. По умолчанию сервер DHCP использует ключевое слово leasetimedefault, однако непосредственное задание опции 51 переопределяет его. 32-разрядное целое число без знака
    See Also:
      - Constant Field Values

  - ### OPTION_SERVER_IDENTIFIER

    public static final byte OPTION_SERVER_IDENTIFIER
    DHCP-опция 54. Используются сервером DHCP или клиентом для указания адреса сервера или сервера, на который направляется сообщение.
    See Also:
      - Constant Field Values

  - ### OPTION_DHCP_MAX_MSG_SIZE

    public static final byte OPTION_DHCP_MAX_MSG_SIZE
    DHCP-опция 57. DHCP Maximum Message Size (длина 2)
    See Also:
      - Constant Field Values

  - ### OPTION_RENEWAL_TIME_VALUE

    public static final byte OPTION_RENEWAL_TIME_VALUE
    DHCP-опция 58. Интервал времени (в секундах), в течение которого клиент должен отправить запрос на обновление. 32-разрядное целое число без знака
    See Also:
      - Constant Field Values

  - ### OPTION_REBINDING_TIME_VALUE

    public static final byte OPTION_REBINDING_TIME_VALUE
    DHCP-опция 59. Интервал времени (в секундах), в течение которого клиент должен отправить запрос на повторное связывание. 32-разрядное целое число без знака
    See Also:
      - Constant Field Values

  - ### OPTION_PARAMETER_REQUEST_LIST

    public static final byte OPTION_PARAMETER_REQUEST_LIST
    DHCP-опция 55. Используется клиентом DHCP для указания требуемых параметров, которые бы он хотел получить от сервера. Сервер может не поддерживать все требуемые клиентом поля и будет возвращать только те, которые ему доступны. В опции фигурирует N байтов, каждый из которых является ссылкой на соответствующую DHCP-опцию. При формировании DHCP-ответа значение опции OPTION_PARAMETER_REQUEST_LIST из DHCP-запроса используется для упорядочивания опций при сериализации.
    See Also:
      - Constant Field Values

  - ### OPTION_VENDOR_CLASS_IDENTIDIER

    public static final byte OPTION_VENDOR_CLASS_IDENTIDIER
    Option 60 (Vendor class identifier) https://tools.ietf.org/html/rfc2132#section-9.13
    See Also:
      - Constant Field Values

  - ### OPTION_CLIENT_IDENTIDIER

    public static final byte OPTION_CLIENT_IDENTIDIER
    DHCP-опция 61. Используется для однозначной идентификации клиента DHCP
    See Also:
      - Constant Field Values

  - ### OPTION_AGENT_INFORMATION

    public static final byte OPTION_AGENT_INFORMATION
    DHCP-опция 82. Используется для того чтобы проинформировать DHCP-сервер о том, от какого DHCP-ретранслятора (DHCP-relay) и через какой его порт был получен запрос
    See Also:
      - Constant Field Values

  - ### OPTION_NAME

    public static String[] OPTION_NAME

  - ### op

    public byte op
    Op code. Тип сообщения. Может принимать значения: BOOTREQUEST (0x01, запрос от клиента к серверу) и BOOTREPLY (0x02, ответ от сервера к клиенту). Размер поля - 1 байт.

  - ### htype

    public byte htype
    HW address Type. Тип аппаратного адреса. Допустимые значения этого поля определены в RFC 1700 «Assigned Numbers». Например, для MAC-адреса Ethernet это поле принимает значение 0x01. Размер поля - 1 байт.

  - ### hlen

    public byte hlen
    Hardware address length. Длина аппаратного адреса в байтах. Для MAC-адреса Ethernet — 0x06. Размер поля - 1 байт

  - ### hops

    public byte hops
    Hw options. Количество промежуточных маршрутизаторов (так называемых агентов ретрансляции DHCP), через которые прошло сообщение. Клиент устанавливает это поле в 0x00. Размер поля - 1 байт

  - ### xid

    public int xid
    Transaction id. Уникальный идентификатор транзакции, генерируемый клиентом в начале процесса получения адреса. Размер поля - 4 байта

  - ### secs

    public short secs
    Elapsed time from trying to boot. Время в секундах с момента начала процесса получения адреса. Может не использоваться (в этом случае оно устанавливается в 0x0000). Размер поля - 2 байта

  - ### flags

    public short flags
    Flags. Поле для флагов — специальных параметров протокола DHCP. Размер поля - 2 байта.

  - ### ciaddr

    public byte[] ciaddr
    Client IP. IP-адрес клиента. Заполняется только в том случае, если клиент уже имеет собственный IP-адрес и способен отвечать на запросы ARP (это возможно, если клиент выполняет процедуру обновления адреса по истечении срока аренды). Размер поля - 4 байта.

  - ### yiaddr

    public byte[] yiaddr
    Your client IP. Новый IP-адрес клиента, предложенный сервером. Размер поля - 4 байта.

  - ### siaddr

    public byte[] siaddr
    Server IP. IP-адрес сервера. Возвращается в предложении DHCP (DHCP-OFFER). Размер поля - 4 байта

  - ### giaddr

    public byte[] giaddr
    Relay agent IP. IP-адрес агента ретрансляции, если таковой участвовал в процессе доставки сообщения DHCP до сервера. Размер поля - 4 байта.

  - ### chaddr

    public byte[] chaddr
    Client HW address. Аппаратный адрес (обычно MAC-адрес) клиента. Размер поля - 16 байт.

  - ### sname

    public byte[] sname
    Optional server host name. Необязательное имя сервера в виде нуль-терминированной строки. Размер поля - 64 байта

  - ### file

    public byte[] file
    Boot file name. Необязательное имя файла на сервере, используемое бездисковыми рабочими станциями при удалённой загрузке. Как и `sname`, представлено в виде нуль-терминированной строки. Размер поля - 128 байт.

  - ### messageType

    public byte messageType
    Тип DHCP-пакета. Размер поля - 1 байт. Возможные значения:
    - `DHCP_DISCOVER`
    - `DHCP_OFFER`
    - `DHCP_REQUEST`
    - `DHCP_DECLINE`
    - `DHCP_ACK`
    - `DHCP_NAK`
    - `DHCP_RELEASE`
    - `DHCP_INFORM`

- ## Constructor Details

  - ### DhcpPacket

    public DhcpPacket()
    Конструктор пустого пакета.

  - ### DhcpPacket

    public DhcpPacket(ByteBuffer request)
    Конструктор пакета - запроса.
    Parameters:
      `request` - содержимое запроса в виде набора байтов

- ## Method Details

  - ### createResponse

    public final DhcpPacket createResponse()
    Создание ответного dhcp-пакета на dhcp-запрос на основании данных запроса.
    Returns:
      dhcp-ответ с установленным полем op=`OP_BOOT_RESPONSE`

  - ### haveSubOptions

    public boolean haveSubOptions()
    Возвращает наличие Options.82 в запросе.
    Returns:
      true - в dhcp-запросе присутствует 82я опция.

  - ### clearSubOptions

    public void clearSubOptions()
    Очистка подопций 82й опции.

  - ### serialize

    public void serialize(ByteBuffer bb)
    Сериализация dhcp-пакета в последовательность байт.
    Parameters:
      `bb` - набор байтов, куда сериализуется пакет

  - ### isFromRelayAgent

    public final boolean isFromRelayAgent()
    Проверка, пришел ли dhcp-запрос от dhcp-relay агента, ретранслировавшего dhcp-запрос от абонента. Анализируется заполненность поля `giaddr`
    Returns:
      true - запрос пришел от dhcp-relay, false - не от dhcp-relay.

  - ### isClientAddressSet

    public final boolean isClientAddressSet()
    Проверка на заполненность поля `ciaddr`
    Returns:

  - ### compare

    public final int compare(DhcpOption o1, DhcpOption o2)
    Сравнение опций в зависимости от их "веса"
    Specified by:
      `compare` in interface `Comparator<DhcpOption>`
    Parameters:
      `o1` -
      `o2` -
    Returns:

  - ### setOption

    public final void setOption(DhcpOption option)
    Установка значения опции в dhcp-пакет.
    Parameters:
      `option` - устанавливаемая опция

  - ### setOption

    public final void setOption(byte code, byte[] value)
    Установка значения dhcp-опции. Опция задается кодом
    Parameters:
      `code` -
      `value` -

  - ### setOption

    public final void setOption(byte code, String stringValue)

  - ### getOption

    public final DhcpOption getOption(byte code)

  - ### setSubOption

    public final void setSubOption(DhcpOption option)

  - ### setSubOption

    public final void setSubOption(byte code, byte[] value)

  - ### setSubOption

    public final void setSubOption(byte code, String stringValue)

  - ### getSubOption

    public final DhcpOption getSubOption(byte code)

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`

  - ### getOption

    public <O> O getOption(DhcpPacket.DhcpPacketOption<O> option)
    Получение опции(атрибута) из пакета. Если такая опция не была установлена - метод вернет null.
    Parameters:
      `option` - идентификатор опции, которая была установлена в обработчике протокола
    Returns:
      значение опции.

  - ### getOption

    public <O> O getOption(DhcpPacket.DhcpPacketOption<O> option, O value)
    Получение опции(атрибута) из пакета. Если такая опция не была установлена - метод вернет value.
    Parameters:
      `option` - идентификатор опции, значение которой нужно получить.
      `value` - - значение по умолчанию
    Returns:
      значение опции

  - ### setOption

    public <O> void setOption(DhcpPacket.DhcpPacketOption<O> option, O value)
    Установка опции в пакет.
    Parameters:
      `option` - идентификатор устанавливаемой опции
      `value` - устанавливаемое значение.

  - ### isNil

    public static final boolean isNil(byte[] b)
    Проверка на незаполненность dhcp-поля, представленного массивом байтов. Если хотя бы один байт массива не нулевой, то это значит, что поле имеет значение.
    Parameters:
      `b` - поле в виде массива байтов
    Returns:
      true - поле не имеет значение и заполнено нулями, false - в поле записано какое-то ненулевое значение.

  - ### isRenewRequest

    public static boolean isRenewRequest(DhcpPacket request)
    Првоеряет, является ли данный dhcp-запрос renew-запросом. Запрос является RENEW, если пакет REQUEST, ciaddr!=0.0.0.0, а опции Server-Identifier и Requested-IP-Address отсутствуют.
    Parameters:
      `request` - проверяемый dhcp-запрос
    Returns:
      true - запрос является renew-запросом, false - не renew-запрос.