Функции и операторы для сетевых адресов

Типы cidr и inet, предназначенные для сетевых IP-адресов, поддерживают обычные операторы сравнения, приведенные в таблице Операторы сравнения, а также специальные операторы и функции, приведенные в Таблице 38 и Таблице 39.

Любое значение типа cidr можно привести к типу inet неявно, поэтому операторы и функции, показанные ниже для типа inet, также работают со значениями типа cidr. (Там, где для inet cidr показаны разные функции, причина этого в том, что в данном случае их поведение с этими двумя типами различается.) Кроме того, разрешено приведение значения типа inet к типу cidr. При этому все биты справа от сетевой маски молча обнуляются, чтобы создать допустимое значение типа cidr.

Таблица 38. Операторы для IP-адресов

Оператор
Описание
Пример(ы)
inet << inet → boolean
Первая подсеть строго содержится во второй? Этот и следующие четыре оператора проверяют вхождение одной подсети в другую. Они рассматривают только сетевые части двух заданных адресов (игнорируя все биты справа от сетевой маски) и определяют, идентична ли одна сеть другой или является ее подсетью.
inet '192.168.1.5' << inet '192.168.1/24' → t
inet '192.168.0.5' << inet '192.168.1/24' → f
inet '192.168.1/24' << inet '192.168.1/24' → f
inet <<= inet → boolean
Первая подсеть содержится во второй или равна ей?
inet '192.168.1/24' <<= inet '192.168.1/24' → t
inet >> inet → boolean
Первая подсеть строго содержит вторую?
inet '192.168.1/24' >> inet '192.168.1.5' → t
inet >>= inet → boolean
Первая подсеть содержит вторую или равна ей?
inet '192.168.1/24' >>= inet '192.168.1/24' → t
inet && inet → boolean
Одна из двух подсетей содержит другую или равна ей?
inet '192.168.1/24' && inet '192.168.1.80/28' → t
inet '192.168.1/24' && inet '192.168.2.0/28' → f
~ inet → inet
Вычисляет результат побитового НЕ.
~ inet '192.168.1.6' → 63.87.254.249
inet & inet → inet
Вычисляет результат побитового И.
inet '192.168.1.6' & inet '0.0.0.255' → 0.0.0.6
inet | inet → inet
Вычисляет результат побитового ИЛИ.
inet '192.168.1.6' | inet '0.0.0.255' → 192.168.1.255
inet + bigint → inet
Добавляет смещение к адресу.
inet '192.168.1.6' + 25 → 192.168.1.31
bigint + inet → inet
Добавляет смещение к адресу.
200 + inet '::ffff:fff0:1' → ::ffff:255.240.0.201
inet - bigint → inet
Вычитает смещение из адреса.
inet '192.168.1.43' - 36 → 192.168.1.7
inet - inet → bigint
Вычисляет разность двух адресов.
inet '192.168.1.43' - inet '192.168.1.19' → 24
inet '::1' - inet '::ffff:1' → -4294901760

Таблица 39. Функции для IP-адресов

Функция
Описание
Пример(ы)
abbrev ( inet ) → text
Создает сокращенный формат отображения адреса в виде текста. (Результат получается тот же, что и у функции вывода inet; «сокращенным» он является только в сравнении с результатом явного приведения к типу text, которое по историческим причинам никогда не будет убирать часть с сетевой маской.)
abbrev(inet '10.1.0.0/32') → 10.1.0.0
abbrev ( cidr ) → text
Создает сокращенный формат отображения адреса в виде текста. (Это сокращение заключается в отбрасывании полностью нулевых октетов справа от сетевой маски; другие примеры см. в таблице Примеры вводимых значений типа cidr.)
abbrev(cidr '10.1.0.0/16') → 10.1/16
broadcast ( inet ) → inet
Вычисляет широковещательный адрес для сети в заданном адресе.
broadcast(inet '192.168.1.5/24') → 192.168.1.255/24
family ( inet ) → integer
Возвращает семейство адреса: 4 для адресов IPv4, 6 для адресов IPv6.
family(inet '::1') → 6
host ( inet ) → text
Возвращает IP-адрес в виде текста, игнорируя сетевую маску.
host(inet '192.168.1.0/24') → 192.168.1.0
hostmask ( inet ) → inet
Вычисляет маску хоста для сети в заданном адресе.
hostmask(inet '192.168.23.20/30') → 0.0.0.3
inet_merge ( inet, inet ) → cidr
Вычисляет наименьшую сеть, содержащую обе заданные сети.
inet_merge(inet '192.168.1.5/24', inet '192.168.2.5/24') → 192.168.0.0/22
inet_same_family ( inet, inet ) → boolean
Проверяет, принадлежат ли адреса одному семейству IP.
inet_same_family(inet '192.168.1.5/24', inet '::1') → f
masklen ( inet ) → integer
Возвращает длину сетевой маски в битах.
masklen(inet '192.168.1.5/24') → 24
netmask ( inet ) → inet
Вычисляет сетевую маску для сети в заданном адресе.
netmask(inet '192.168.1.5/24') → 255.255.255.0
network ( inet ) → cidr
Возвращает сетевую часть адреса, обнуляя все биты справа от сетевой маски. (Это равнозначно приведению значения к типу cidr.)
network(inet '192.168.1.5/24') → 192.168.1.0/24
set_masklen ( inet, integer ) → inet
Задает длину сетевой маски для значения типа inet. Адресная часть при этом не меняется.
set_masklen(inet '192.168.1.5/24', 16) → 192.168.1.5/16
set_masklen ( cidr, integer ) → cidr
Задает длину сетевой маски для значения cidr. Биты адреса справа от новой сетевой маски при этом устанавливаются в ноль.
set_masklen(cidr '192.168.1.0/24', 16) → 192.168.0.0/16
text ( inet ) → text
Возвращает несокращенный IP-адрес и длину сетевой маски в виде текста. (Такой же результат получается при явном приведении к типу text.)
text(inet '192.168.1.5') → 192.168.1.5/32

Совет
Функции abbrev, host и text предназначены в основном для отображения IP-адресов в альтернативных форматах.

Типы для MAC-адресов, macaddr и macaddr8, поддерживают обычные операторы сравнения, приведенные в таблице Операторы сравнения, а также специальные функции, приведенные в Таблице 40. Кроме того, они поддерживают побитовые логические операторы ~, & и | (НЕ, И и ИЛИ), показанные выше для IP-адресов.

Таблица 40. Функции для MAC-адресов

Функция
Описание
Пример(ы)
trunc ( macaddr ) → macaddr
Устанавливает в ноль 3 последних байта адреса. Оставшийся префикс можно сопоставить с конкретным производителем (используя информацию, отсутствующую в QHB).
trunc(macaddr '12:34:56:78:90:ab') → 12:34:56:00:00:00
trunc ( macaddr8 ) → macaddr8
Устанавливает в ноль 5 последних байта адреса. Оставшийся префикс можно сопоставить с конкретным производителем (используя информацию, отсутствующую в QHB).
trunc(macaddr8 '12:34:56:78:90:ab:cd:ef') → 12:34:56:00:00:00:00:00
macaddr8_set7bit ( macaddr8 ) → macaddr8
Устанавливает единицу в 7-м бите адреса, создавая так называемый модифицированный идентификатор EUI-64 для включения в адрес IPv6.
macaddr8_set7bit(macaddr8 '00:34:56:ab:cd:ef') → 02:34:56:ff:fe:ab:cd:ef