Exemplo n.º 1
0
 def _update_v6_fields(self, source_obj, dest_obj):
     if not source_obj._next_header._is_default:
         dest_obj.is_override_next_header = True
         dest_obj.next_header = Converter.convertstring2int(
             source_obj._next_header.current_val)
     dest_obj.traffic_class = int(
         source_obj.traffic_class
     )  #int(Converter.remove_non_hexa_sumbols(hex(int(source_obj.traffic_class))))#Converter.convertstring2int(source_obj.traffic_class)
     dest_obj.hop_limit = int(
         source_obj.hop_limit)  #Converter.convertstring2int
     dest_obj.flow_label = Converter.convertstring2int(
         source_obj.flow_label)
     dest_obj.src_addr_hi, dest_obj.src_addr_lo = self._handle_v6(
         source_obj.source_ip.value)
     dest_obj.dst_addr_hi, dest_obj.dst_addr_lo = self._handle_v6(
         source_obj.destination_ip.value)
     dest_obj.src_addr_mode = OstinatoEnums.unified_to_ostinato(
         source_obj.source_ip.mode)
     dest_obj.src_addr_count = int(
         source_obj.source_ip.count
     ) if source_obj.source_ip.count != '0' else 1
     dest_obj.dst_addr_mode = OstinatoEnums.unified_to_ostinato(
         source_obj.destination_ip.mode)
     dest_obj.dst_addr_count = int(
         source_obj.destination_ip.count
     ) if source_obj.destination_ip.count != '0' else 1
     return dest_obj
Exemplo n.º 2
0
    def create_tcp_obj(cls, utg_tcp):
        flags_list = [
            int(utg_tcp.flag_urgent_pointer_valid),
            int(utg_tcp.flag_acknowledge_valid),
            int(utg_tcp.flag_push_function),
            int(utg_tcp.flag_reset_connection),
            int(utg_tcp.flag_synchronize_sequence),
            int(utg_tcp.flag_no_more_data_from_sender)
        ]
        flags = functools.reduce(lambda out, x: (out << 1) + int(x),
                                 flags_list, 0)

        header_obj = TCP(
            sport=int(utg_tcp.source_port.value),
            dport=int(utg_tcp.destination_port.value),
            seq=Converter.hexaString2int(utg_tcp.sequence_number),
            ack=Converter.hexaString2int(utg_tcp.acknowledgement_number),
            #off_x2 TODO
            flags=flags,
            win=Converter.hexaString2int(utg_tcp.window),
            #sum TODO
            urp=Converter.hexaString2int(utg_tcp.urgent_pointer)
            #opts TODO
        )
        return header_obj
Exemplo n.º 3
0
 def _handle_v6(self, input):
     input = Converter.expand_ipv6(input)
     input = Converter.remove_non_hexa_sumbols(input)
     split = int(len(input) / 2)
     low = Converter.convertstring2int(input[split:])
     high = Converter.convertstring2int(input[:split])
     return high, low
Exemplo n.º 4
0
 def _apply_data_pattern(self):
     sp_obj = self._stream_driver_obj.frame  #type: StcStream()
     if self.packet.data_pattern.type is TGEnums.DATA_PATTERN_TYPE.FIXED:
         #!!! currently custom type not supported by 400G ,used custom header instead
         pl = Converter.remove_non_hexa_sumbols(
             self.packet.data_pattern.value)
         sp_obj.add_header(StcFrame_Layers.UpperLayerProtocols_II.Custom,
                           pattern=pl)
         #sp_obj.Payload.update_fields(pattern=self.packet.data_pattern.value)
         # pl = self.packet.data_pattern.value
         # res = ''
         # lst = pl.split()
         # for x in lst:
         #     r = Converter.convertstring2int(x)
         #     res += str(r)
         #     res += ' '
         # self._stream_driver_obj.frame.custom_pl(res)
         return
     elif self.packet.data_pattern.type is TGEnums.DATA_PATTERN_TYPE.INCREMENT_BYTE \
             or self.packet.data_pattern.type is TGEnums.DATA_PATTERN_TYPE.INCREMENT_WORD:
         fill_type = 'INCR'
         data = 0
     elif self.packet.data_pattern.type is TGEnums.DATA_PATTERN_TYPE.DECREMENT_BYTE\
             or self.packet.data_pattern.type is TGEnums.DATA_PATTERN_TYPE.DECREMENT_WORD:
         fill_type = 'DECR'
         data = 0
     elif self.packet.data_pattern.type is TGEnums.DATA_PATTERN_TYPE.REPEATING:
         fill_type = 'CONSTANT'
         int_pl = Converter.convertstring2int(
             self.packet.data_pattern.value)
         data = int_pl
     self._stream_driver_obj.set_attributes(FillType=fill_type,
                                            ConstantFillPattern=data)
Exemplo n.º 5
0
 def handle_filter_conditions(utg_trigger, ost_trigger):
     for cond in utg_trigger.conditions:
         term = ost_trigger.terms.add()
         term.offset = cond.match_term.offset
         pattern = Converter.remove_non_hexa_sumbols(
             cond.match_term.pattern)
         mask = Converter.remove_non_hexa_sumbols(
             cond.match_term.mask
         ) if cond.match_term.mask is not None else "F" * len(pattern)
         term.pattern = pattern
         term.mask = mask
         term.is_not = True if cond.logical_operator is TGEnums.LOGICAL_OPERATOR.NOT else False
Exemplo n.º 6
0
 def refresh(self):
     self._parent._driver_obj.wait_for_up(20)
     self._parent._driver_obj.interfaceTable.send_arp_refresh()
     res_table = self._parent._driver_obj.interfaceTable.read_port_neighbors(
     )
     self.learned_table = []
     for if_key in res_table:
         iface_table = res_table[if_key]
         for entry in iface_table:
             isIp4 = True if Converter.intIp2string(Converter.uc23(
                 entry[1])) else False
             if isIp4:
                 self.learned_table.append(learned_entry(
                     entry[0], entry[1]))
Exemplo n.º 7
0
    def create_gre_obj(cls, utg_gre):
        # type: (Packet.GRE) -> object
        obj = GRE()
        #bin_headers = '0x' + binascii.hexlify(obj.bin()).decode('utf-8')
        obj.version_number = utg_gre.version
        #bin_headers = '0x' + binascii.hexlify(obj.bin()).decode('utf-8')
        if utg_gre.use_checksum is True:
            obj.opts.append(GREOptionChecksum(checksum=0))
            obj.opts.append(GREOptionReserve_1())
            obj.checksum_bit = 1
        #bin_headers = '0x' + binascii.hexlify(obj.bin()).decode('utf-8')
        if utg_gre.key_field is not None:
            obj.opts.append(
                GREOptionKey(
                    key=Converter.convertstring2int(utg_gre.key_field)))
            obj.key_bit = 1
        #bin_headers = '0x' + binascii.hexlify(obj.bin()).decode('utf-8')
        if utg_gre.sequence_number is not None:
            obj.opts.append(
                GREOptionSequence(sequence=Converter.convertstring2int(
                    utg_gre.sequence_number)))
            obj.sequence_bit = 1
        #bin_headers = '0x' + binascii.hexlify(obj.bin()).decode('utf-8')
        if utg_gre.use_checksum is True:
            innerPacketData = obj.bin()
            if utg_gre.l3_proto is TGEnums.L3_PROTO.IPV4:
                obj.protocol_type = ETH_TYPE_IP
                packer_v4 = utg_gre.ipv4.to_packer()
                innerPacketData += packer_v4.bin()
            elif utg_gre.l3_proto is TGEnums.L3_PROTO.IPV6:
                obj.protocol_type = ETH_TYPE_IP6
                v6 = utg_gre.ipv6.to_packer()
                innerPacketData += v6.bin()
            else:
                proto = Converter.remove_non_hexa_sumbols(utg_gre.l3_proto)
                proto = Converter.hexaString2int(proto)
                obj.protocol_type = proto

            if utg_gre.l4_proto is TGEnums.L4_PROTO.UDP:
                packer_udp = utg_gre.udp.to_packer()
                innerPacketData += packer_udp.bin()
            elif utg_gre.l4_proto is TGEnums.L4_PROTO.TCP:
                packer_tcp = utg_gre.tcp.to_packer()
                innerPacketData += packer_tcp.bin()

            s = checksum.in_cksum(innerPacketData)
            obj.opts[0].checksum = s
        #bin_headers = '0x' + binascii.hexlify(obj.bin()).decode('utf-8')
        return obj
Exemplo n.º 8
0
def pattern_to_ascii_chars(pattern):
    asci_chars = bytes() if PY3K else ""
    patternString = Converter.remove_non_hexa_sumbols(pattern[:])
    while patternString:
        tmp_char = chr(int(patternString[:2], 16))
        char = bytes(tmp_char, 'latin-1') if PY3K else tmp_char
        asci_chars += char
        patternString = patternString[2:]
    return bytes(asci_chars) if PY3K else asci_chars
Exemplo n.º 9
0
    def _update_v4_fields(self, source_obj, dest_obj):

        dest_obj.dst_ip = Converter.stringIp2int(
            source_obj.destination_ip.value)
        dest_obj.dst_ip_mode = OstinatoEnums.unified_to_ostinato(
            source_obj.destination_ip.mode)
        dest_obj.dst_ip_count = int(source_obj.destination_ip.count)
        dest_obj.dst_ip_mask = Converter.stringIp2int(
            source_obj.destination_ip.mask)

        dest_obj.src_ip = Converter.stringIp2int(source_obj.source_ip.value)
        dest_obj.src_ip_mode = OstinatoEnums.unified_to_ostinato(
            source_obj.source_ip.mode)
        dest_obj.src_ip_count = int(source_obj.source_ip.count)
        dest_obj.src_ip_mask = Converter.stringIp2int(
            source_obj.source_ip.mask)

        dest_obj.ttl = int(source_obj.ttl)
        dest_obj.is_override_hdrlen = source_obj.enable_header_len_override
        dest_obj.is_override_totlen = source_obj.length_override
        if source_obj.checksum_mode is TGEnums.CHECKSUM_MODE.OVERRIDE:
            dest_obj.is_override_cksum = True
            dest_obj.cksum = int(source_obj.custom_checksum, 16)
        dest_obj.ver_hdrlen = source_obj.header_len_override_value
        dest_obj.tos = int(source_obj.dscp_decimal_value, 16)
        dest_obj.totlen = source_obj.length_value
        dest_obj.id = int(source_obj.identifier)
        dest_obj.frag_ofs = source_obj.fragment_offset_decimal_value
        #ip.options = source_obj.options_padding ::==>>Ostinato's TODO ip options
        #ip.is_override_ver =
        if self.packet.l4_proto is TGEnums.L4_PROTO.GRE:
            dest_obj.is_override_proto = True
            dest_obj.proto = 0x2F
        elif self.packet.l4_proto is TGEnums.L4_PROTO.NONE:
            #common default value
            dest_obj.is_override_proto = True
            dest_obj.proto = source_obj.protocol
        elif not source_obj._protocol._is_default:
            dest_obj.is_override_proto = True
            dest_obj.proto = source_obj.protocol
        df = 0 if source_obj.fragment_enable else 2
        mf = 0 if source_obj.fragment_last_enable else 1
        dest_obj.flags = df + mf
        return dest_obj
Exemplo n.º 10
0
 def __init__(self, initdata=None):
     if initdata:
         data = initdata.split("/")
     else:
         data = [None, None, None]
     if data[0]:
         self.chassis = data[0]
     if data[1]:
         self.slot = data[1]
     isIp = Converter.stringIp2int(data[2])
     self.port = data[2] if isIp is None else str(isIp)
Exemplo n.º 11
0
 def getPortDataConfig(cls,pid):
     try:
         isIp = False if pid < 256 else Converter.intIp2string(pid)
         searchName = 'slan0'+str(pid) if not isIp else cls._portNameByIP(isIp)
         ostPortInfo = list(filter(lambda ostPrt: searchName in ostPrt.name.lower() ,cls._PortConfigList.port[:]))[0]
         pIdList = ost_pb.PortIdList()
         pIdList.port_id.add().id = ostPortInfo.port_id.id
         pConfig = cls._drone.getPortConfig(pIdList)
     except Exception as e:
         raise Exception("Failed to assotiate ip to Nic... maybe wrong ip?\n"  + "\n" + str(e))
     return pIdList,pConfig
Exemplo n.º 12
0
    def apply_filters(self):
        self._logger.info(self._get_port_log_title(), self._get_port_log_message())
        terms = list(set().union(self.filter_properties.filters[1]._get_match_term_list(),
                                 self.filter_properties.filters[2]._get_match_term_list(),
                                 self.filter_properties.filters[3]._get_match_term_list(),
                                 self.filter_properties.capture_filter._get_match_term_list()
                                 )
                     )
        self._clear_filters()
        for i, term in enumerate(terms):
            if term._type is not TGEnums.MATCH_TERM_TYPE.SIZE:
                mask = 'FFFFFFFFFFFF0000' if term.mask is None else term.mask
                mask = "{:0<18}".format('0x' + Converter.remove_non_hexa_sumbols(mask.upper()))
                copyPattern = "{:0<18}".format('0x'+Converter.remove_non_hexa_sumbols(term._pattern[:]).upper())
                self._update_field(driver_field='PM_CREATE',value=xenaCommandParams.build(ix=i))
                self._update_field(driver_field='PM_POSITION', value=xenaCommandParams.build([term.offset],ix=i))
                self._update_field(driver_field='PM_MATCH', value=xenaCommandParams.build([mask,copyPattern],ix=i))
                term._id = pow(2, i)
            else:
                self._update_field(driver_field='PL_CREATE', value=xenaCommandParams.build(ix=1))
                self._update_field(driver_field='PL_LENGTH', value=xenaCommandParams.build(['AT_LEAST', term.from_size], ix=1))
                self._update_field(driver_field='PL_CREATE', value=xenaCommandParams.build(ix=2))
                self._update_field(driver_field='PL_LENGTH', value=xenaCommandParams.build(['AT_MOST', term.to_size], ix=2))
                term._id = pow(2, 17) +pow(2, 18)

        triggers = list(filter(lambda x: x is not None, self.filter_properties.filters))
        #TODO delete filters/conditions on reserve
        for trId,trigger in enumerate(triggers):
            if trigger.enabled:
                cond_lst = trigger.conditions  # type: list[condition]
                conditions_matrix = [0, 0, 0, 0, 0, 0]
                pair_index = 0
                for cn in cond_lst:
                    in_pair_index = 1 if cn.logical_operator is TGEnums.LOGICAL_OPERATOR.NOT else 0
                    if cn.logical_operator is TGEnums.LOGICAL_OPERATOR.OR:
                        pair_index += 2
                    conditions_matrix[pair_index+in_pair_index] += cn.match_term._id
                if any(conditions_matrix):
                    self._port_driver_obj.add_filter(xenaCommandParams.build(conditions_matrix))
Exemplo n.º 13
0
 def _apply_udfs(self):
     for udf in self.packet.modifiers:
         curUdf = self.packet.modifiers[udf]
         if curUdf.enabled is True:
             p, pOffset = self._get_header_by_offset(curUdf.byte_offset)
             if p:
                 protoproto = self._protoprotoMap[id(p)]
                 variable_field = protoproto.variable_field.add()
                 variable_field.offset = curUdf.byte_offset - pOffset
                 variable_field.type = int(curUdf.bit_type.value / 16)
                 variable_field.value = Converter.stringMac2int(
                     curUdf.repeat_init, ' ')
                 variable_field.mode = OstinatoEnums.unified_to_ostinato(
                     curUdf.repeat_mode)
                 variable_field.count = int(curUdf.repeat_count)
                 variable_field.step = int(curUdf.repeat_step)
Exemplo n.º 14
0
 def _add_update_modifier(self,
                          field,
                          offset,
                          count=None,
                          mode=TGEnums.MODIFIER_UDF_REPEAT_MODE.UP,
                          initVal='0',
                          step=1):
     from xenavalkyrie.xena_stream import XenaModifierAction
     sMask = '0xFFFF0000'
     rep = 1
     smMaxVal = 0xFFFF
     startValue = Converter.convertstring2int(initVal)
     startValue &= 0xFFFF
     adapter = 1  #if step > 1 else 1
     if mode is TGEnums.MODIFIER_UDF_REPEAT_MODE.UP:
         mode = XenaModifierAction.increment
         minVal = startValue
         maxVal = smMaxVal - 1 if count is None else startValue + step * (
             count - adapter)
     else:
         mode = XenaModifierAction.decrement
         maxVal = startValue
         minVal = 0 if count is None else startValue - count * step + adapter
     if not field._driver_obj:
         field._driver_obj = self._stream_driver_obj.add_modifier(
             position=offset,
             mask=sMask,
             action=mode,
             repeat=rep,
             min_val=minVal,
             step=step,
             max_val=maxVal)
     else:
         field._driver_obj.update(position=offset,
                                  mask=sMask,
                                  action=mode,
                                  repeat=rep,
                                  min_val=minVal,
                                  step=step,
                                  max_val=maxVal)
Exemplo n.º 15
0
def v6_to_packer_format(v6_addr):
    return pattern_to_ascii_chars(
        Converter.remove_non_hexa_sumbols(Converter.expand_ipv6(v6_addr)))
Exemplo n.º 16
0
    def apply_filters(self):
        def handle_filter_conditions(trigger, current_stat_prefix):
            # type: (trafficFilter, object) -> object
            patternCount = 0
            udpate_list = {}
            for cond in trigger.conditions:
                if cond.match_term._type is TGEnums.MATCH_TERM_TYPE.MAC_DA:
                    dest_field = 'CaptureFilterDA'
                    value = 'notAddr' if cond.logical_operator is TGEnums.LOGICAL_OPERATOR.NOT else 'addr'
                elif cond.match_term._type is TGEnums.MATCH_TERM_TYPE.MAC_SA:
                    dest_field = 'CaptureFilterSA'
                    value = 'notAddr' if cond.logical_operator is TGEnums.LOGICAL_OPERATOR.NOT else 'addr'
                elif cond.match_term._type is TGEnums.MATCH_TERM_TYPE.CUSTOM:
                    dest_field = 'CaptureFilterPattern'
                    if patternCount > 0:
                        value = "pattern1AndPattern2"
                    else:
                        value = 'notPattern' if cond.logical_operator is TGEnums.LOGICAL_OPERATOR.NOT else 'pattern'
                    patternCount += 1
                elif cond.match_term._type is TGEnums.MATCH_TERM_TYPE.SIZE:
                    from_size = 'CaptureFilterFrameSizeFrom'
                    to_size = 'CaptureFilterFrameSizeTo'
                    size_enable = 'CaptureFilterFrameSizeEnable'
                    udpate_list[size_enable] = True
                    udpate_list[from_size] = cond.match_term._from_size
                    udpate_list[to_size] = cond.match_term._to_size
                    continue
                if patternCount < 2 or cond.match_term._type is not TGEnums.MATCH_TERM_TYPE.CUSTOM:
                    value += str(cond.match_term._id)

                udpate_list[dest_field] = value

            filter_obj.update(**udpate_list)
            #field = 'filter.' + current_stat_prefix + dest_field
            #self._update_field(driver_field=field, value=value)

        # caller_name = inspect.stack()[1][3]
        # need_write = False if caller_name is "apply" else True
        terms = list(set().union(
            self.filter_properties.filters[1]._get_match_term_list(),
            self.filter_properties.filters[2]._get_match_term_list(),
            self.filter_properties.filters[3]._get_match_term_list(),
            self.filter_properties.capture_filter._get_match_term_list()))

        udpate_list = {}
        ixiaResourceMap = {'SA': 0, 'DA': 0, 'Pattern': 0}
        for term in terms:
            patternValue = term._pattern if term._type is not TGEnums.MATCH_TERM_TYPE.SIZE else None
            patternValue = patternValue.replace('{', '').replace('}', '')
            if term._type is TGEnums.MATCH_TERM_TYPE.MAC_DA:
                dest_field = 'DA'
            elif term._type is TGEnums.MATCH_TERM_TYPE.MAC_SA:
                dest_field = 'SA'
            elif term._type is TGEnums.MATCH_TERM_TYPE.CUSTOM:
                dest_field = 'Pattern'
                patId = ixiaResourceMap[dest_field] + 1
                udpate_list['PatternOffset' + str(patId)] = term._offset
                #self._update_field(driver_field='filterPallette.patternOffset' + str(patId), value=term._offset)
                spacedPattern = ""
                copyPattern = Converter.remove_non_hexa_sumbols(
                    term._pattern[:])
                while copyPattern:
                    spacedPattern += copyPattern[:2]
                    spacedPattern += " "
                    copyPattern = copyPattern[2:]
                patternValue = spacedPattern
            elif term._type is TGEnums.MATCH_TERM_TYPE.SIZE:
                continue
            ixiaResourceMap[dest_field] += 1
            term._id = ixiaResourceMap[dest_field]
            field = dest_field + str(ixiaResourceMap[dest_field])
            udpate_list[field] = patternValue
            mask = dest_field + 'Mask' + str(ixiaResourceMap[dest_field])
            if term._mask is not None:
                mask_val = term._mask
            else:
                pat = Converter.remove_non_hexa_sumbols(patternValue)
                mask_len = len(pat) / 2 - 1
                mask_val = "00"
                for i in range(int(mask_len)):
                    mask_val += " 00"
            udpate_list[mask] = mask_val

        # fp_obj.Pattern1 = 'AA'
        # fp_obj.DA1 = '00 11 22 33 44 55'
        if udpate_list:
            #cap_obj = self._port_driver_obj.Capture  # type: Capture
            fp_obj = self._port_driver_obj.Capture.FilterPallette  # type: FilterPallette
            fp_obj.update(**udpate_list)

        triggers = list(
            filter(lambda x: x is not None, self.filter_properties.filters))
        triggers.append(self.filter_properties.capture_filter)
        #self._port_driver_obj.filter.ix_set_default()
        for trId, trigger in enumerate(triggers):
            trId += 1
            if trId < 3:
                continue
                current_stat_prefix = 'userDefinedStat' + str(trId)
            elif trId == 4:
                current_stat_prefix = 'captureFilter'
                filter_obj = self._port_driver_obj.Capture.Filter  # type: Filter
                filter_obj.CaptureFilterEnable = int(trigger.enabled)
            elif trId == 3:
                continue
                current_stat_prefix = 'captureTrigger'
            #filter_obj.CaptureFilterEnable = int(trigger.enabled)
            if not trigger.enabled:
                continue
            handle_filter_conditions(trigger, current_stat_prefix)
Exemplo n.º 17
0
 def init_vlan(utg_vlan, ost_vlan):
     ost_vlan.is_override_tpid = True
     ost_vlan.tpid = Converter.convertstring2int(utg_vlan.proto)
     priority = (int(utg_vlan.priority) << 13)
     cfi = (int(utg_vlan.cfi) << 12)
     ost_vlan.vlan_tag = int(utg_vlan.vid.value) + priority + cfi