def update(self, rcv_time, dp_id, msg): super(GaugeFlowTableInfluxDBLogger, self).update(rcv_time, dp_id, msg) jsondict = msg.to_jsondict() points = [] for stats_reply in jsondict['OFPFlowStatsReply']['body']: stats = stats_reply['OFPFlowStats'] packet_count = int(stats['packet_count']) byte_count = int(stats['byte_count']) instructions = stats['instructions'] tags = { 'dp_name': self.dp.name, 'table_id': int(stats['table_id']), 'priority': int(stats['priority']), 'inst_count': len(instructions), } oxm_matches = stats['match']['OFPMatch']['oxm_fields'] for oxm_match in oxm_matches: oxm_tlv = oxm_match['OXMTlv'] mask = oxm_tlv['mask'] val = oxm_tlv['value'] field = oxm_tlv['field'] if mask is not None: val = '/'.join((str(val), str(mask))) tags[field] = val if field == 'vlan_vid' and mask is None: tags['vlan'] = devid_present(int(val)) points.append( self.make_point(tags, rcv_time, 'flow_packet_count', packet_count)) points.append( self.make_point(tags, rcv_time, 'flow_byte_count', byte_count)) self.ship_points(points)
def _parse_flow_stats(self, stats): """Parse flow stats reply message into tags/labels and byte/packet counts.""" packet_count = int(stats['packet_count']) byte_count = int(stats['byte_count']) instructions = stats['instructions'] tags = { 'dp_name': self.dp.name, 'dp_id': hex(self.dp.dp_id), 'table_id': int(stats['table_id']), 'priority': int(stats['priority']), 'inst_count': len(instructions), 'cookie': int(stats['cookie']), } oxm_matches = stats['match']['OFPMatch']['oxm_fields'] for oxm_match in oxm_matches: oxm_tlv = oxm_match['OXMTlv'] mask = oxm_tlv['mask'] val = oxm_tlv['value'] orig_field = oxm_tlv['field'] if mask is not None: val = '/'.join((str(val), str(mask))) field = OLD_MATCH_FIELDS.get(orig_field, orig_field) tags[field] = val if field == 'vlan_vid' and mask is None: tags['vlan'] = devid_present(int(val)) return ( ('flow_packet_count', tags, packet_count), ('flow_byte_count', tags, byte_count))
def _parse_flow_stats(self, stats): """Parse flow stats reply message into tags/labels and byte/packet counts.""" packet_count = int(stats['packet_count']) byte_count = int(stats['byte_count']) instructions = stats['instructions'] tags = { 'dp_name': self.dp.name, 'dp_id': hex(self.dp.dp_id), 'table_id': int(stats['table_id']), 'priority': int(stats['priority']), 'inst_count': len(instructions), } oxm_matches = stats['match']['OFPMatch']['oxm_fields'] for oxm_match in oxm_matches: oxm_tlv = oxm_match['OXMTlv'] mask = oxm_tlv['mask'] val = oxm_tlv['value'] field = oxm_tlv['field'] if mask is not None: val = '/'.join((str(val), str(mask))) if field in OLD_MATCH_FIELDS: field = OLD_MATCH_FIELDS[field] tags[field] = val if field == 'vlan_vid' and mask is None: tags['vlan'] = devid_present(int(val)) return (('flow_packet_count', tags, packet_count), ('flow_byte_count', tags, byte_count))
def flow_timeout(self, table_id, match): ofmsgs = [] if table_id in (self.eth_src_table.table_id, self.eth_dst_table.table_id): in_port = None eth_src = None eth_dst = None vid = None for field, value in list(match.items()): if field == 'in_port': in_port = value elif field == 'eth_src': eth_src = value elif field == 'eth_dst': eth_dst = value elif field == 'vlan_vid': vid = valve_of.devid_present(value) if vid: vlan = self.vlans[vid] if eth_src and in_port: port = self.ports[in_port] ofmsgs.extend(self._src_rule_expire(vlan, port, eth_src)) elif eth_dst: ofmsgs.extend(self._dst_rule_expire(vlan, eth_dst)) return ofmsgs
def flow_timeout(self, now, table_id, match): ofmsgs = [] if table_id in (self.eth_src_table.table_id, self.eth_dst_table.table_id): if 'vlan_vid' in match: vlan = self.vlans[valve_of.devid_present(match['vlan_vid'])] in_port = None eth_src = None eth_dst = None for field, value in list(match.items()): if field == 'in_port': in_port = value elif field == 'eth_src': eth_src = value elif field == 'eth_dst': eth_dst = value if eth_src and in_port: port = self.ports[in_port] ofmsgs.extend(self._src_rule_expire(vlan, port, eth_src)) elif eth_dst: ofmsgs.extend(self._dst_rule_expire(now, vlan, eth_dst)) return ofmsgs