示例#1
0
def get_flow_info_from_any(flow):
    w_mdata = inv_flow_parser.get_instruction_writemeta(flow.rdata)
    lport = flow.pdata.get('lport') if flow.pdata else None
    serviceid = flow.pdata.get('serviceid') if flow.pdata else None
    if w_mdata:
        metadata = w_mdata['metadata']
        mask = w_mdata['metadata-mask']
        lport = inv_flow_parser.get_lport_from_metadata(
            metadata, mask) if not lport else lport
        if lport:
            flow.pdata['lport'] = int(lport, 16)
        serviceid = inv_flow_parser.get_service_id_from_metadata(
            metadata, mask) if not serviceid else serviceid
        if serviceid:
            flow.pdata['serviceid'] = int(serviceid, 16)
    m_metadata = inv_flow_parser.get_match_metadata(flow.rdata)
    if m_metadata:
        elan = flow.pdata.get('elan-tag')
        vpnid = flow.pdata.get('vpnid')
        metadata = m_metadata['metadata']
        mask = m_metadata['metadata-mask']
        if not lport:
            lport = inv_flow_parser.get_lport_from_metadata(metadata, mask)
            if lport:
                flow.pdata['lport'] = int(lport, 16)
        if not serviceid:
            serviceid = inv_flow_parser.get_service_id_from_metadata(
                metadata, mask)
            if serviceid:
                flow.pdata['serviceid'] = int(serviceid, 16)
        if not elan:
            elan = inv_flow_parser.get_elan_from_metadata(metadata, mask)
            if elan:
                flow.pdata['elan-tag'] = int(elan, 16)
        if not vpnid:
            vpnid = inv_flow_parser.get_vpnid_from_metadata(metadata, mask)
            if vpnid:
                flow.pdata['vpnid'] = vpnid
    if not flow.pdata.get('dst-mac'):
        m_ether_dest = inv_flow_parser.get_match_ether_dest(flow.rdata)
        if m_ether_dest:
            flow.pdata['dst-mac'] = m_ether_dest.lower()
    if not flow.pdata.get('src-mac'):
        m_ether_src = inv_flow_parser.get_match_ether_src(flow.rdata)
        if m_ether_src:
            flow.pdata['src-mac'] = m_ether_src.lower()
    if not flow.pdata.get('dst-ip4'):
        m_ipv4_dest = inv_flow_parser.get_match_ipv4_dest(flow.rdata)
        if m_ipv4_dest:
            flow.pdata['dst-ip4'] = m_ipv4_dest
    if not flow.pdata.get('src-ip4'):
        m_ipv4_src = inv_flow_parser.get_match_ipv4_src(flow.rdata)
        if m_ipv4_src:
            flow.pdata['src-ip4'] = m_ipv4_src
    return flow.pdata
示例#2
0
def get_flow_info_from_elan_table(flow):
    m_metadata = inv_flow_parser.get_match_metadata(flow.rdata)
    if m_metadata:
        metadata = m_metadata['metadata']
        mask = m_metadata['metadata-mask']
        elan = inv_flow_parser.get_elan_from_metadata(metadata, mask)
        if elan:
            flow.pdata['lport'] = int(elan, 16)
            flow.pdata['elan-tag'] = int(elan, 16)
        lport = inv_flow_parser.get_lport_from_metadata(metadata, mask)
        if lport:
            flow.pdata['lport'] = int(lport, 16)
    m_ether_dest = inv_flow_parser.get_match_ether_dest(flow.rdata)
    if m_ether_dest:
        flow.pdata['dst-mac'] = m_ether_dest.lower()
    m_ether_src = inv_flow_parser.get_match_ether_src(flow.rdata)
    if m_ether_src:
        flow.pdata['src-mac'] = m_ether_src.lower()
    if not flow.pdata.get('lport'):
        reg6_load = inv_flow_parser.get_act_reg6load(flow.rdata)
        if reg6_load and reg6_load.get('value'):
            # reg6load value is lport lft-shit by 8 bits.
            lport = ('%x' % reg6_load.get('value'))[:-2]
            flow.pdata['lport'] = int(lport, 16)
    return flow.pdata
示例#3
0
def get_flow_info_from_ifm_table(flow):
    flow.pdata['ifname'] = get_ifname_from_flowid(flow.rdata['id'],
                                                  flow.rdata['table_id'])
    w_mdata = inv_flow_parser.get_instruction_writemeta(flow.rdata)
    if w_mdata:
        metadata = w_mdata['metadata']
        mask = w_mdata['metadata-mask']
        lport = inv_flow_parser.get_lport_from_metadata(metadata, mask)
        if lport:
            flow.pdata['lport'] = int(lport, 16)
        service_id = inv_flow_parser.get_service_id_from_metadata(
            metadata, mask)
        if service_id:
            flow.pdata['serviceid'] = int(service_id, 16)
    m_reg6 = inv_flow_parser.get_match_reg6(flow.rdata)
    if not flow.pdata.get('lport'):
        lport = inv_flow_parser.get_lport_from_mreg6(m_reg6)
        if lport:
            flow.pdata['lport'] = int(lport, 16)
    if flow.rdata['table_id'] == 0:
        m_inport = inv_flow_parser.get_match_inport(flow.rdata)
        if m_inport:
            flow.pdata['ofport'] = Model.get_ofport_from_ncid(m_inport)
        m_vlan = inv_flow_parser.get_match_vlanid(flow.rdata)
        if m_vlan and m_vlan.get('vlan-id'):
            flow.pdata['vlanid'] = m_vlan.get('vlan-id')
    elif flow.rdata['table_id'] == 220:
        a_output = inv_flow_parser.get_act_output(flow.rdata)
        a_vlan = inv_flow_parser.get_act_set_vlanid(flow.rdata)
        if a_output and a_output.get('output-node-connector'):
            flow.pdata['ofport'] = a_output.get('output-node-connector')
        if a_vlan and a_vlan.get('vlan-id'):
            flow.pdata['vlanid'] = a_vlan.get('vlan-id')
    return flow.pdata
示例#4
0
def get_flow_info_from_acl_table(flow):
    m_metadata = inv_flow_parser.get_match_metadata(flow.rdata)
    if m_metadata:
        metadata = m_metadata['metadata']
        mask = m_metadata['metadata-mask']
        lport = inv_flow_parser.get_lport_from_metadata(metadata, mask)
        if lport:
            flow.pdata['lport'] = int(lport, 16)
    a_conntrk = inv_flow_parser.get_act_conntrack(flow.rdata)
    if a_conntrk and a_conntrk.get('conntrack-zone'):
        flow.pdata['elan-tag'] = a_conntrk.get('conntrack-zone')
    return flow.pdata
示例#5
0
def get_flow_info_from_l3vpn_table(flow):
    label = inv_flow_parser.get_match_mpls(flow.rdata)
    if not label and flow.rdata['table_id'] == 36:
        label = inv_flow_parser.get_match_tunnelid(flow.rdata)
    if label:
        flow.pdata['mpls'] = label
    a_group = inv_flow_parser.get_act_group(flow.rdata)
    if a_group and a_group.get('group-id'):
        flow.pdata['group-id'] = a_group.get('group-id')
    m_metadata = inv_flow_parser.get_match_metadata(flow.rdata)
    if m_metadata:
        metadata = m_metadata['metadata']
        mask = m_metadata['metadata-mask']
        lport = inv_flow_parser.get_lport_from_metadata(metadata, mask)
        if lport:
            flow.pdata['lport'] = int(lport, 16)
        vpnid = inv_flow_parser.get_vpnid_from_metadata(metadata, mask)
        if vpnid:
            flow.pdata['vpnid'] = (metadata & inv_flow_parser.VRFID_MASK) / 2
    return flow.pdata
示例#6
0
def get_flow_info_from_nat_table(flow):
    m_metadata = inv_flow_parser.get_match_metadata(flow.rdata)
    vpnid = None
    if m_metadata:
        metadata = m_metadata['metadata']
        mask = m_metadata['metadata-mask']
        lport = inv_flow_parser.get_lport_from_metadata(metadata, mask)
        if lport:
            flow.pdata['lport'] = int(lport, 16)
        vpnid = inv_flow_parser.get_vpnid_from_metadata(metadata, mask)
        if vpnid:
            flow.pdata['vpnid'] = vpnid
    if not vpnid:
        w_metadata = inv_flow_parser.get_instruction_writemeta(flow.rdata)
        metadata = w_metadata['metadata']
        mask = w_metadata['metadata-mask']
        vpnid = inv_flow_parser.get_vpnid_from_metadata(metadata, mask)
        if vpnid:
            flow.pdata['vpnid'] = vpnid
    m_ipv4_dest = inv_flow_parser.get_match_ipv4_dest(flow.rdata)
    m_ipv4_src = inv_flow_parser.get_match_ipv4_src(flow.rdata)
    a_set_ipv4_dest = inv_flow_parser.get_act_set_ipv4_dest(flow.rdata)
    a_set_ipv4_src = inv_flow_parser.get_act_set_ipv4_src(flow.rdata)
    m_ether_src = inv_flow_parser.get_match_ether_src(flow.rdata)
    if flow.rdata['table_id'] in [25, 27]:
        if a_set_ipv4_dest:
            flow.pdata['int-ip4'] = a_set_ipv4_dest
        if m_ipv4_dest:
            flow.pdata['ext-ip4'] = m_ipv4_dest
        m_ether_dest = inv_flow_parser.get_match_ether_dest(flow.rdata)
        if m_ether_dest:
            flow.pdata['ext-mac'] = m_ether_dest
    if flow.rdata['table_id'] in [26, 28]:
        if a_set_ipv4_src:
            flow.pdata['ext-ip4'] = a_set_ipv4_src
        if m_ipv4_src:
            flow.pdata['int-ip4'] = m_ipv4_src
        m_ether_src = inv_flow_parser.get_match_ether_src(flow.rdata)
        if m_ether_src:
            flow.pdata['ext-mac'] = m_ether_src
    return flow.pdata