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;
}
Beispiel #2
0
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;
}