예제 #1
0
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
예제 #2
0
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)
예제 #3
0
파일: spec.py 프로젝트: vigor-nf/vigor
        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:
예제 #4
0
        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)])