Interface::Addresses ThriftConfigApplier::getInterfaceAddresses( const cfg::Interface* config) { Interface::Addresses addrs; for (const auto& addr : config->ipAddresses) { auto intfAddr = IPAddress::createNetwork(addr, -1, false); auto ret = addrs.insert(intfAddr); if (!ret.second) { throw FbossError("Duplicate network IP address ", addr, " in interface ", config->intfID); } auto ret2 = intfRouteTables_[RouterID(config->routerID)].emplace( IPAddress::createNetwork(addr), std::make_pair(InterfaceID(config->intfID), intfAddr.first)); if (!ret2.second) { // we get same network, only allow it if that is from the same interface auto other = ret2.first->second.first; if (other != InterfaceID(config->intfID)) { throw FbossError("Duplicate network address ", addr, " of interface ", config->intfID, " as interface ", other, " in VRF ", config->routerID); } } } return addrs; }
InterfaceFields InterfaceFields::fromFollyDynamic(const folly::dynamic& json) { auto intfFields = InterfaceFields(InterfaceID(json[kIntfId].asInt()), RouterID(json[kRouterId].asInt()), VlanID(json[kVlanId].asInt()), json[kName].asString(), MacAddress(json[kMac].asString())); ThriftSerializerJson<cfg::NdpConfig> serializer; for (const auto& addr: json[kAddresses]) { auto cidr = IPAddress::createNetwork(addr.asString(), -1 /*use /32 for v4 and /128 for v6*/, false /*don't apply mask*/); intfFields.addrs[cidr.first] = cidr.second; } serializer.deserialize(toJson(json[kNdpConfig]), &intfFields.ndp); return intfFields; }
shared_ptr<Interface> ThriftConfigApplier::createInterface( const cfg::Interface* config, const Interface::Addresses& addrs) { auto name = getInterfaceName(config); auto mac = getInterfaceMac(config); auto mtu = config->__isset.mtu ? config->mtu : Interface::kDefaultMtu; auto intf = make_shared<Interface>(InterfaceID(config->intfID), RouterID(config->routerID), VlanID(config->vlanID), name, mac, mtu); intf->setAddresses(addrs); if (config->__isset.ndp) { intf->setNdpConfig(config->ndp); } return intf; }