| 145 | |
| 146 | template <StaticNAT::Direction dir> |
| 147 | inline void StaticNAT::DoProcessBatch(Context *ctx, bess::PacketBatch *batch) { |
| 148 | gate_idx_t ogate_idx = static_cast<gate_idx_t>(dir); |
| 149 | int cnt = batch->cnt(); |
| 150 | |
| 151 | for (int i = 0; i < cnt; i++) { |
| 152 | bess::Packet *pkt = batch->pkts()[i]; |
| 153 | auto *eth = pkt->head_data<bess::utils::Ethernet *>(); |
| 154 | auto *ip = reinterpret_cast<bess::utils::Ipv4 *>(eth + 1); |
| 155 | |
| 156 | be32_t &addr_be = (dir == kForward) ? ip->src : ip->dst; |
| 157 | uint32_t addr = addr_be.value(); |
| 158 | |
| 159 | for (const auto &pair : pairs_) { |
| 160 | uint32_t start_addr = (dir == kForward) ? pair.int_addr : pair.ext_addr; |
| 161 | if (start_addr <= addr && addr < start_addr + pair.size) { |
| 162 | uint32_t diff = (dir == kForward) ? (pair.ext_addr - pair.int_addr) |
| 163 | : (pair.int_addr - pair.ext_addr); |
| 164 | be32_t new_addr_be = be32_t(addr + diff); |
| 165 | UpdateChecksum(ip, bess::utils::ChecksumIncrement32( |
| 166 | addr_be.raw_value(), new_addr_be.raw_value())); |
| 167 | addr_be = new_addr_be; |
| 168 | break; |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | // If there is no matching address pair, forward without NAT. |
| 173 | // TODO: add an option to redirect unmatched traffic to a specified ogate |
| 174 | |
| 175 | EmitPacket(ctx, pkt, ogate_idx); |
| 176 | } |
| 177 | } |
| 178 | |
| 179 | void StaticNAT::ProcessBatch(Context *ctx, bess::PacketBatch *batch) { |
| 180 | gate_idx_t incoming_gate = ctx->current_igate; |
nothing calls this directly
no test coverage detected