2.2. Измнение программ хостов для поддержки подсетей
В большинстве реализация протокола IP имеется код для обслуживания исходящих потоков типа приведенного ниже:
IF ip_net_number(packet.ip_dest) = ip_net_number(my_ip_addr) THEN send_packet_locally(packet, packet.ip_dest) ELSE send_packet_locally(packet, gateway_to(ip_net_number(packet.ip_dest)))
Код с поддержкой множества подключенных сетей несколько сложнее, но в данном случае это не имеет значения.
Для поддержки подсетей нужно сохранить одно дополнительное 32-битовое значение — маску IP (my_ip_mask). Эта битовая маска представляет собой строку битов, в которой установлены (1) значения битов, соответствующий номеру сети IP и номеру подсети. Например, для сети класса A с 8-битовым полем номера подсети маска будет иметь значение 255.255.0.0.
Упомянутый выше код тогда принимает вид:
IF bitwise_and(packet.ip_dest, my_ip_mask) = bitwise_and(my_ip_addr, my_ip_mask) THEN send_packet_locally(packet, packet.ip_dest) ELSE send_packet_locally(packet, gateway_to(bitwise_and(packet.ip_dest, my_ip_mask)))
Очевидно, что часть выражения в условном операторе может быть вычислена заранее.
Может потребоваться изменение функции gateway_to с включением такого же условия сравнения.
Для поддержки хостов со множеством подключения код может быть изменен так, чтобы значения my_ip_addr и my_ip_mask сохранялись для каждого интерфейса, а выражения в условном операторе должны вычисляться для каждого интерфейса.