MCPcopy Create free account
hub / github.com/NetSys/bess / DoProcessBatch

Method DoProcessBatch

core/modules/static_nat.cc:147–177  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

145
146template <StaticNAT::Direction dir>
147inline 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
179void StaticNAT::ProcessBatch(Context *ctx, bess::PacketBatch *batch) {
180 gate_idx_t incoming_gate = ctx->current_igate;

Callers

nothing calls this directly

Calls 6

UpdateChecksumFunction · 0.85
ChecksumIncrement32Function · 0.85
valueMethod · 0.80
raw_valueMethod · 0.80
cntMethod · 0.45
pktsMethod · 0.45

Tested by

no test coverage detected