/* iterate through netifs */
for(netif = netif_list; netif != NULL; netif = netif->next) {
/* network mask matches? */
- if (ip_addr_maskcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
+ if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
/* return netif on which to forward IP packet */
return netif;
}
if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr)) ||
/* or broadcast matching this interface network address? */
(ip_addr_isbroadcast(&(iphdr->dest), netif) &&
- ip_addr_maskcmp(&(iphdr->dest), &(netif->ip_addr), &(netif->netmask))) ||
+ ip_addr_netcmp(&(iphdr->dest), &(netif->ip_addr), &(netif->netmask))) ||
/* or restricted broadcast? */
ip_addr_cmp(&(iphdr->dest), IP_ADDR_BROADCAST)) {
LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n",
/* address matches network interface address exactly? => no broadcast */
else if (addr->addr == netif->ip_addr.addr)
return 0;
- /* host identifier bits are all ones? => network broadcast address */
- else if ((addr->addr & ~netif->netmask.addr) ==
+ /* on the same (sub) network and
+ * host identifier bits are all ones? => network broadcast address */
+ else if (ip_addr_netcmp(addr->addr, netif->ip_addr.addr, netif->netmask.addr))
+ && ((addr->addr & ~netif->netmask.addr) ==
(ip_addr_broadcast.addr & ~netif->netmask.addr))
return 1;
else
struct netif *netif;
for(netif = netif_list; netif != NULL; netif = netif->next) {
- if (ip_addr_maskcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
+ if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
return netif;
}
}
int
-ip_addr_maskcmp(struct ip_addr *addr1, struct ip_addr *addr2,
+ip_addr_netcmp(struct ip_addr *addr1, struct ip_addr *addr2,
struct ip_addr *mask)
{
return((addr1->addr[0] & mask->addr[0]) == (addr2->addr[0] & mask->addr[0]) &&
* @arg mask network identifier mask
* @return !0 if the network identifiers of both address match
*/
-#define ip_addr_maskcmp(addr1, addr2, mask) (((addr1)->addr & \
+#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
(mask)->addr) == \
((addr2)->addr & \
(mask)->addr))
(ipaddr)->addr[2] = htonl(((e & 0xffff) << 16) | (f & 0xffff)); \
(ipaddr)->addr[3] = htonl(((g & 0xffff) << 16) | (h & 0xffff)); } while(0)
-int ip_addr_maskcmp(struct ip_addr *addr1, struct ip_addr *addr2,
+int ip_addr_netcmp(struct ip_addr *addr1, struct ip_addr *addr2,
struct ip_addr *mask);
int ip_addr_cmp(struct ip_addr *addr1, struct ip_addr *addr2);
void ip_addr_set(struct ip_addr *dest, struct ip_addr *src);