2.2. Изменение программ на хостах для поддержки подсетей
В большинстве реализаций IP имеется код, обслуживающий исходящие дейтаграммы и принимающий решение о передаче каждой дейтаграммы хосту локальной сети или пересылке ее на шлюз (маршрутизатор). В общем случае этот фрагмент кода работает так:
IF ip_net_number(dg.ip_dest) = ip_net_number(my_ip_addr) THEN send_dg_locally(dg, dg.ip_dest) ELSE send_dg_locally(dg, gateway_to(ip_net_number(dg.ip_dest)))
(при обслуживании множество соединений, код становится более сложны, но в контексте данного документа это не имеет значения).
Для поддержки подсетей требуется сохранять одно или несколько 32-битовых значений, называемых масками. В этой битовой маске установлены (1) биты, соответствующие полям номера сети IP, и дополнительные биты, соответствующие полю номера подсети.
Соответствующий код будет иметь вид:
IF bitwise_and(dg.ip_dest, my_ip_mask) = bitwise_and(my_ip_addr, my_ip_mask) THEN send_dg_locally(dg, dg.ip_dest) ELSE send_dg_locally(dg, gateway_to(bitwise_and(dg.ip_dest, my_ip_mask)))
Часть выражений в условиях может быть вычислена заранее (известна). Может потребоваться изменение функции gateway_to так, чтобы она принимала во внимание биты номера подсети при выполнении операций сравнения.
Для поддержки хостов с множеством подключений (сетевых интерфейсов — прим. перев.) код может быть изменен та, чтобы значения my_ip_addr и my_ip_mask сохранялись для каждого интерфейса. Проверка условий должна выполняться для каждого интерфейса таких хостов.