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

# Class DhcpPacket

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

All Implemented Interfaces:
  `java.util.Comparator<DhcpOption>`

    public final class DhcpPacket
    extends java.lang.Object
    implements java.util.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 int` | `DHCP_ACK` | Code for DHCPACK Message
  `static int` | `DHCP_DECLINE` | Code for DHCPDECLINE Message
  `static int` | `DHCP_DISCOVER` | Code for DHCPDISCOVER Message
  `static int` | `DHCP_INFORM` | Code for DHCPINFORM Message
  `static int` | `DHCP_NAK` | Code for DHCPNAK Message
  `static int` | `DHCP_OFFER` | Code for DHCPOFFER Message
  `static int` | `DHCP_RELEASE` | Code for DHCPRELEASE Message
  `static 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 byte` | `OP_BOOT_REQUEST` | Тип DHCP-сообщения - от клиента к серверу
  `static byte` | `OP_BOOT_RESPONSE` | Тип DHCP-сообщения - от сервера к клиенту
  `static byte` | `OPTION_AGENT_INFORMATION` | DHCP-опция 82.
  `static byte` | `OPTION_CLIENT_IDENTIDIER` | DHCP-опция 61.
  `static byte` | `OPTION_COOKIE_SERVER` | DHCP-опция 8.
  `static byte` | `OPTION_DOMAIN_NAME` | DHCP-опция 15.
  `static byte` | `OPTION_DOMAIN_NAME_SERVER` | DHCP-опция 6.
  `static byte` | `OPTION_HOST_NAME` | DHCP-опция 12.
  `static byte` | `OPTION_IP_ADDRESS_LEASE_TIME` | DHCP-опция 51.
  `static byte` | `OPTION_LOG_SERVER` | DHCP-опция 7.
  `static byte` | `OPTION_LPR_SERVER` | DHCP-опция 9.
  `static byte` | `OPTION_NAME_SERVER` | DHCP-опция 5.
  `static byte` | `OPTION_PARAMETER_REQUEST_LIST` | DHCP-опция 55.
  `static byte` | `OPTION_REBINDING_TIME_VALUE` | DHCP-опция 59.
  `static byte` | `OPTION_RENEWAL_TIME_VALUE` | DHCP-опция 58.
  `static byte` | `OPTION_REQUESTED_IP_ADDRESS` | DHCP-опция 50.
  `static byte` | `OPTION_ROUTER` | DHCP-опция 3.
  `static byte` | `OPTION_SERVER_IDENTIFIER` | DHCP-опция 54.
  `static byte` | `OPTION_SUBNET_MASK` | DHCP-опция 1.
  `static byte` | `OPTION_TIME_OFFSET` | DHCP-опция 2.
  `static byte` | `OPTION_TIME_SERVER` | DHCP-опция 4.
  `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 byte` | `ZERO` | Константа для нулевого значения байта

- ## Constructor Summary

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

- ## Method Summary

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

  - ### 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​(java.nio.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​(java.nio.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 `java.util.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, java.lang.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, java.lang.String stringValue)

  - ### getSubOption

    public final DhcpOption getSubOption​(byte code)

  - ### toString

    public java.lang.String toString()
    Overrides:
      `toString` in class `java.lang.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-запрос.