1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| 734 void fib_add_ifaddr(struct in_ifaddr *ifa) 735 { 736 struct in_device *in_dev = ifa->ifa_dev; 737 struct net_device *dev = in_dev->dev; 738 struct in_ifaddr *prim = ifa; 739 __be32 mask = ifa->ifa_mask; 740 __be32 addr = ifa->ifa_local; 741 __be32 prefix = ifa->ifa_address & mask; 742 743 if (ifa->ifa_flags & IFA_F_SECONDARY) { 744 prim = inet_ifa_byprefix(in_dev, prefix, mask); 745 if (prim == NULL) { 746 pr_warn("%s: bug: prim == NULL\n", __func__); 747 return; 748 } 749 } 750 751 fib_magic(RTM_NEWROUTE, RTN_LOCAL, addr, 32, prim); 752 753 if (!(dev->flags & IFF_UP)) 754 return; 755 756 757 if (ifa->ifa_broadcast && ifa->ifa_broadcast != htonl(0xFFFFFFFF)) 758 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, prim); 759 760 if (!ipv4_is_zeronet(prefix) && !(ifa->ifa_flags & IFA_F_SECONDARY) && 761 (prefix != addr || ifa->ifa_prefixlen < 32)) { 762 fib_magic(RTM_NEWROUTE, 763 dev->flags & IFF_LOOPBACK ? RTN_LOCAL : RTN_UNICAST, 764 prefix, ifa->ifa_prefixlen, prim); 765 766 767 if (ifa->ifa_prefixlen < 31) { 768 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, prefix, 32, prim); 769 fib_magic(RTM_NEWROUTE, RTN_BROADCAST, prefix | ~mask, 770 32, prim); 771 } 772 } 773 }
|