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_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 байт. Возможные значения:
  • 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-запрос.