TODO(torek): move this to set/get runtime config
| 63 | |
| 64 | // TODO(torek): move this to set/get runtime config |
| 65 | CommandResponse NAT::Init(const bess::pb::NATArg &arg) { |
| 66 | // Check before committing any changes. |
| 67 | for (const auto &address_range : arg.ext_addrs()) { |
| 68 | for (const auto &range : address_range.port_ranges()) { |
| 69 | if (range.begin() >= range.end() || range.begin() > UINT16_MAX || |
| 70 | range.end() > UINT16_MAX) { |
| 71 | return CommandFailure(EINVAL, "Port range for address %s is malformed", |
| 72 | address_range.ext_addr().c_str()); |
| 73 | } |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | for (const auto &address_range : arg.ext_addrs()) { |
| 78 | auto ext_addr = address_range.ext_addr(); |
| 79 | be32_t addr; |
| 80 | |
| 81 | bool ret = bess::utils::ParseIpv4Address(ext_addr, &addr); |
| 82 | if (!ret) { |
| 83 | return CommandFailure(EINVAL, "invalid IP address %s", ext_addr.c_str()); |
| 84 | } |
| 85 | |
| 86 | ext_addrs_.push_back(addr); |
| 87 | // Add a port range list |
| 88 | std::vector<PortRange> port_list; |
| 89 | if (address_range.port_ranges().size() == 0) { |
| 90 | port_list.emplace_back(PortRange{ |
| 91 | .begin = 0u, .end = 65535u, .suspended = false, |
| 92 | }); |
| 93 | } |
| 94 | for (const auto &range : address_range.port_ranges()) { |
| 95 | port_list.emplace_back(PortRange{ |
| 96 | .begin = (uint16_t)range.begin(), |
| 97 | .end = (uint16_t)range.end(), |
| 98 | // Control plane gets to decide if the port range can be used. |
| 99 | .suspended = range.suspended()}); |
| 100 | } |
| 101 | port_ranges_.push_back(port_list); |
| 102 | } |
| 103 | |
| 104 | if (ext_addrs_.empty()) { |
| 105 | return CommandFailure(EINVAL, |
| 106 | "at least one external IP address must be specified"); |
| 107 | } |
| 108 | |
| 109 | // Sort so that GetInitialArg is predictable and consistent. |
| 110 | std::sort(ext_addrs_.begin(), ext_addrs_.end()); |
| 111 | |
| 112 | return CommandSuccess(); |
| 113 | } |
| 114 | |
| 115 | CommandResponse NAT::GetInitialArg(const bess::pb::EmptyArg &) { |
| 116 | bess::pb::NATArg resp; |
nothing calls this directly
no test coverage detected