sflow: Export LAG, PORTNAME, and OPENFLOWPORT information also.
[cascardo/ovs.git] / lib / sflow_receiver.c
index e6fc9a7..aff62fe 100644 (file)
@@ -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;