from state import flow_emap EXP_TIME = 10 * 1000 EXT_IP_ADDR = ext_ip EXT_PORT = 1 if a_packet_received: flow_emap.expire_all(now - EXP_TIME) h3 = pop_header(tcpudp, on_mismatch=([], [])) h2 = pop_header(ipv4, on_mismatch=([], [])) h1 = pop_header(ether, on_mismatch=([], [])) internal_flow_id = FlowIdc(h3.src_port, h3.dst_port, h2.saddr, h2.daddr, received_on_port, h2.npid) if (received_on_port != EXT_PORT and not flow_emap.has(internal_flow_id) and not flow_emap.full()): idx = the_index_allocated flow_emap.add(internal_flow_id, idx, now) return ([EXT_PORT], [ ether(h1, saddr=..., daddr=...), ipv4(h2, cksum=..., saddr=EXT_IP_ADDR), tcpudp(h3, src_port=idx + start_port) ]) else: pass
from state import flow_emap EXP_TIME = 10 * 1000 EXT_PORT = 1 if a_packet_received: flow_emap.expire_all(now - EXP_TIME) h3 = pop_header(tcpudp, on_mismatch=([], [])) h2 = pop_header(ipv4, on_mismatch=([], [])) h1 = pop_header(ether, on_mismatch=([], [])) if received_on_port == EXT_PORT: flow_indx = h3.dst_port - start_port if flow_emap.has_idx(flow_indx): # Flow is present in the table flow_emap.refresh_idx(flow_indx, now) else: # packet from the internal network internal_flow_id = FlowIdc(h3.src_port, h3.dst_port, h2.saddr, h2.daddr, received_on_port, h2.npid) if flow_emap.has(internal_flow_id): # flow present in the table flow_emap.refresh_idx(flow_emap.get(internal_flow_id), now) elif not flow_emap.full(): # No flow in the table, but some space idx = the_index_allocated flow_emap.add(internal_flow_id, idx, now)
if backend_ip_emap.has_idx(backend_id): flow_emap.refresh_idx(flow_emap.get(packet_flow), now) backend = backends.get(backend_id) return ([backend.nic], [ether(h1, saddr=..., daddr=backend.mac), ipv4(h2, cksum=..., daddr=backend.ip), tcpudp(h3)]) else: flow_emap.erase(packet_flow) alloc_flow_and_process_packet = True else: alloc_flow_and_process_packet = True if alloc_flow_and_process_packet: if backend_ip_emap.exists_with_cht(cht, _LoadBalancedFlow_hash(packet_flow)): bknd = backend_ip_emap.choose_with_cht(cht, _LoadBalancedFlow_hash(packet_flow)) if not flow_emap.full(): idx = the_index_allocated flow_emap.add(packet_flow, idx, now) flow_id_to_backend_id.set(idx, bknd) backend = backends.get(bknd) return ([backend.nic], [ether(h1, saddr=..., daddr=backend.mac), ipv4(h2, cksum=..., daddr=backend.ip), tcpudp(h3)]) else: return ([],[]) else: # A heartbeat from a backend bknd_addr = ip_addrc(h2.saddr) if backend_ip_emap.has(bknd_addr): backend_ip_emap.refresh_idx(backend_ip_emap.get(bknd_addr), now) else:
if (internal_flow.dip != h2.saddr or internal_flow.dp != h3.src_port or internal_flow.prot != h2.npid): return ([],[]) else: return ([internal_flow.idev], [ether(h1, saddr=..., daddr=...), ipv4(h2, cksum=..., saddr=internal_flow.dip, daddr=internal_flow.sip), tcpudp(src_port=internal_flow.dp, dst_port=internal_flow.sp)]) else: return ([],[]) else: # packet from the internal network internal_flow_id = FlowIdc(h3.src_port, h3.dst_port, h2.saddr, h2.daddr, received_on_port, h2.npid) if flow_emap.has(internal_flow_id): # flow present in the table idx = flow_emap.get(internal_flow_id) flow_emap.refresh_idx(idx, now) return ([EXT_PORT], [ether(h1, saddr=..., daddr=...), ipv4(h2, cksum=..., saddr=EXT_IP_ADDR), tcpudp(h3, src_port=idx + start_port)]) else: # No flow in the table if flow_emap.full(): # flowtable overflow return ([],[]) else: idx = the_index_allocated flow_emap.add(internal_flow_id, idx, now) return ([EXT_PORT], [ether(h1, saddr=..., daddr=...), ipv4(h2, cksum=..., saddr=EXT_IP_ADDR), tcpudp(h3, src_port=idx + start_port)])