- nsamples=EXTRACT_BE_U_4(sflow_datagram->samples);
- ND_PRINT("sFlowv%u, %s agent %s, agent-id %u, seqnum %u, uptime %u, samples %u, length %u",
- EXTRACT_BE_U_4(sflow_datagram->version),
- EXTRACT_BE_U_4(sflow_datagram->ip_version) == 1 ? "IPv4" : "IPv6",
- ipaddr_string(ndo, sflow_datagram->agent),
- EXTRACT_BE_U_4(sflow_datagram->agent_id),
- EXTRACT_BE_U_4(sflow_datagram->seqnum),
- EXTRACT_BE_U_4(sflow_datagram->uptime),
- nsamples,
- len);
-
- /* skip Common header */
- tptr += sizeof(struct sflow_datagram_t);
- tlen -= sizeof(struct sflow_datagram_t);
+ if (ip_version == 1) {
+ nsamples = GET_BE_U_4(sflow_datagram->samples);
+ ND_PRINT("sFlowv%u, %s agent %s, agent-id %u, seqnum %u, uptime %u, samples %u, length %u",
+ GET_BE_U_4(sflow_datagram->version),
+ "IPv4",
+ GET_IPADDR_STRING(sflow_datagram->agent),
+ GET_BE_U_4(sflow_datagram->agent_id),
+ GET_BE_U_4(sflow_datagram->seqnum),
+ GET_BE_U_4(sflow_datagram->uptime),
+ nsamples,
+ len);
+
+ /* skip Common header */
+ ND_ICHECK_ZU(tlen, <, sizeof(struct sflow_datagram_t));
+ tptr += sizeof(struct sflow_datagram_t);
+ tlen -= sizeof(struct sflow_datagram_t);
+ } else {
+ nsamples = GET_BE_U_4(sflow_v6_datagram->samples);
+ ND_PRINT("sFlowv%u, %s agent %s, agent-id %u, seqnum %u, uptime %u, samples %u, length %u",
+ GET_BE_U_4(sflow_v6_datagram->version),
+ "IPv6",
+ GET_IP6ADDR_STRING(sflow_v6_datagram->agent),
+ GET_BE_U_4(sflow_v6_datagram->agent_id),
+ GET_BE_U_4(sflow_v6_datagram->seqnum),
+ GET_BE_U_4(sflow_v6_datagram->uptime),
+ nsamples,
+ len);