mirror of
https://github.com/openvswitch/ovs
synced 2025-10-25 15:07:05 +00:00
sflow: Export LAG, PORTNAME, and OPENFLOWPORT information also.
Export standard sFlow LAG, PORTNAME and OPENFLOWPORT structures with each counter-sample. Add unit-test for sFlow-LAG. Adjust other unit-tests to accommodate these new annotations. The sFlow-LAG structures are important for topology discovery, for troubleshooting LAG instability, and for correctly combining sFlow feeds from multiple sources. The OPENFLOWPORT and PORTNAME structures are important for systems that aim to combine sFlow monitoring with OpenFlow controls, as they provide straightforward mapping (1) between sFlow agent IP and OpenFlow datapath-id, and (2) between interface name,ifIndex and OpenFlow port number. Signed-off-by: Neil McKee <neil.mckee@inmon.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
@@ -464,6 +464,14 @@ static int computeFlowSampleSize(SFLReceiver *receiver, SFL_FLOW_SAMPLE_TYPE *fs
|
||||
case SFLFLOW_EX_MPLS_FTN: elemSiz = mplsFtnEncodingLength(&elem->flowType.mpls_ftn); break;
|
||||
case SFLFLOW_EX_MPLS_LDP_FEC: elemSiz = mplsLdpFecEncodingLength(&elem->flowType.mpls_ldp_fec); break;
|
||||
case SFLFLOW_EX_VLAN_TUNNEL: elemSiz = vlanTunnelEncodingLength(&elem->flowType.vlan_tunnel); break;
|
||||
case SFLFLOW_EX_IPV4_TUNNEL_EGRESS:
|
||||
case SFLFLOW_EX_IPV4_TUNNEL_INGRESS:
|
||||
elemSiz = sizeof(SFLSampled_ipv4);
|
||||
break;
|
||||
case SFLFLOW_EX_VNI_EGRESS:
|
||||
case SFLFLOW_EX_VNI_INGRESS:
|
||||
elemSiz = sizeof(SFLExtended_vni);
|
||||
break;
|
||||
default:
|
||||
sflError(receiver, "unexpected packet_data_tag");
|
||||
return -1;
|
||||
@@ -560,6 +568,8 @@ int sfl_receiver_writeFlowSample(SFLReceiver *receiver, SFL_FLOW_SAMPLE_TYPE *fs
|
||||
putNet32(receiver, elem->flowType.ethernet.eth_type);
|
||||
break;
|
||||
case SFLFLOW_IPV4:
|
||||
case SFLFLOW_EX_IPV4_TUNNEL_EGRESS:
|
||||
case SFLFLOW_EX_IPV4_TUNNEL_INGRESS:
|
||||
putNet32(receiver, elem->flowType.ipv4.length);
|
||||
putNet32(receiver, elem->flowType.ipv4.protocol);
|
||||
put32(receiver, elem->flowType.ipv4.src_ip.addr);
|
||||
@@ -591,6 +601,11 @@ int sfl_receiver_writeFlowSample(SFLReceiver *receiver, SFL_FLOW_SAMPLE_TYPE *fs
|
||||
case SFLFLOW_EX_MPLS_FTN: putMplsFtn(receiver, &elem->flowType.mpls_ftn); break;
|
||||
case SFLFLOW_EX_MPLS_LDP_FEC: putMplsLdpFec(receiver, &elem->flowType.mpls_ldp_fec); break;
|
||||
case SFLFLOW_EX_VLAN_TUNNEL: putVlanTunnel(receiver, &elem->flowType.vlan_tunnel); break;
|
||||
case SFLFLOW_EX_VNI_EGRESS:
|
||||
case SFLFLOW_EX_VNI_INGRESS:
|
||||
putNet32(receiver, elem->flowType.tunnel_vni.vni);
|
||||
break;
|
||||
|
||||
default:
|
||||
sflError(receiver, "unexpected packet_data_tag");
|
||||
return -1;
|
||||
@@ -629,11 +644,14 @@ static int computeCountersSampleSize(SFLReceiver *receiver, SFL_COUNTERS_SAMPLE_
|
||||
cs->num_elements++;
|
||||
siz += 8; /* tag, length */
|
||||
switch(elem->tag) {
|
||||
case SFLCOUNTERS_GENERIC: elemSiz = sizeof(elem->counterBlock.generic); break;
|
||||
case SFLCOUNTERS_ETHERNET: elemSiz = sizeof(elem->counterBlock.ethernet); break;
|
||||
case SFLCOUNTERS_GENERIC: elemSiz = SFL_CTR_GENERIC_XDR_SIZE; break;
|
||||
case SFLCOUNTERS_ETHERNET: elemSiz = SFL_CTR_ETHERNET_XDR_SIZE; break;
|
||||
case SFLCOUNTERS_TOKENRING: elemSiz = sizeof(elem->counterBlock.tokenring); break;
|
||||
case SFLCOUNTERS_VG: elemSiz = sizeof(elem->counterBlock.vg); break;
|
||||
case SFLCOUNTERS_VLAN: elemSiz = sizeof(elem->counterBlock.vlan); break;
|
||||
case SFLCOUNTERS_LACP: elemSiz = SFL_CTR_LACP_XDR_SIZE; break;
|
||||
case SFLCOUNTERS_OPENFLOWPORT: elemSiz = SFL_CTR_OPENFLOWPORT_XDR_SIZE; break;
|
||||
case SFLCOUNTERS_PORTNAME: elemSiz = stringEncodingLength(&elem->counterBlock.portName.portName); break;
|
||||
default:
|
||||
sflError(receiver, "unexpected counters_tag");
|
||||
return -1;
|
||||
@@ -735,6 +753,27 @@ int sfl_receiver_writeCountersSample(SFLReceiver *receiver, SFL_COUNTERS_SAMPLE_
|
||||
putNet32(receiver, elem->counterBlock.vlan.broadcastPkts);
|
||||
putNet32(receiver, elem->counterBlock.vlan.discards);
|
||||
break;
|
||||
case SFLCOUNTERS_LACP:
|
||||
putMACAddress(receiver, elem->counterBlock.lacp.actorSystemID);
|
||||
putMACAddress(receiver, elem->counterBlock.lacp.partnerSystemID);
|
||||
putNet32(receiver, elem->counterBlock.lacp.attachedAggID);
|
||||
put32(receiver, elem->counterBlock.lacp.portState.all);
|
||||
putNet32(receiver, elem->counterBlock.lacp.LACPDUsRx);
|
||||
putNet32(receiver, elem->counterBlock.lacp.markerPDUsRx);
|
||||
putNet32(receiver, elem->counterBlock.lacp.markerResponsePDUsRx);
|
||||
putNet32(receiver, elem->counterBlock.lacp.unknownRx);
|
||||
putNet32(receiver, elem->counterBlock.lacp.illegalRx);
|
||||
putNet32(receiver, elem->counterBlock.lacp.LACPDUsTx);
|
||||
putNet32(receiver, elem->counterBlock.lacp.markerPDUsTx);
|
||||
putNet32(receiver, elem->counterBlock.lacp.markerResponsePDUsTx);
|
||||
break;
|
||||
case SFLCOUNTERS_OPENFLOWPORT:
|
||||
putNet64(receiver, elem->counterBlock.ofPort.datapath_id);
|
||||
putNet32(receiver, elem->counterBlock.ofPort.port_no);
|
||||
break;
|
||||
case SFLCOUNTERS_PORTNAME:
|
||||
putString(receiver, &elem->counterBlock.portName.portName);
|
||||
break;
|
||||
default:
|
||||
sflError(receiver, "unexpected counters_tag");
|
||||
return -1;
|
||||
|
||||
Reference in New Issue
Block a user