dataDataRecordCallbackFunction(sourceId, ti, recordLength, record);
ipfixReceiver->dataDataRecordCallbackFunction(sourceId, ti, recordLength, record);
static void processDataSet(SourceID sourceId, IpfixSetHeader* set) {	BufferedTemplate* bt = getBufferedTemplate(sourceId, ntoh(set->id));	if (bt == 0) {		errorf("Template %d unknown to collecting process", ntoh(set->id));		return;		}		#ifdef SUPPORT_NETFLOWV9	if ((bt->setID == IPFIX_SetId_Template) || (bt->setID == NetflowV9_SetId_Template)) {	#else	if (bt->setID == IPFIX_SetId_Template) {	#endif  		if (dataRecordCallbackFunction == 0) return;		TemplateInfo* ti = bt->templateInfo;		uint16 length = ntoh(set->length)-((byte*)(&set->data)-(byte*)set);		byte* record = &set->data;			if (bt->recordLength < 65535) {			byte* recordX = record+length;			/* We stop processing when no full record is left */			while (record < recordX - (bt->recordLength - 1)) {				dataRecordCallbackFunction(sourceId, ti, bt->recordLength, record);				record = record + bt->recordLength;				}			} else {			byte* recordX = record+length;			/* We assume that all variable-length records are >= 4 byte, so we stop processing when only 3 bytes are left */			while (record < recordX - 3) {				int recordLength=0;				int i;				for (i = 0; i < ti->fieldCount; i++) {					int fieldLength = 0;					if (ti->fieldInfo[i].typeX.length < 65535) {						fieldLength = ti->fieldInfo[i].typeX.length;						} else {						if (*(byte*)record < 255) {							fieldLength = *(byte*)record;							} else {							fieldLength = *(uint16*)(record+1);							}						}					ti->fieldInfo[i].typeX.length = fieldLength;					ti->fieldInfo[i].offset = recordLength;					recordLength += fieldLength;					}				dataRecordCallbackFunction(sourceId, ti, recordLength, record);				record = record + recordLength;				}			}		} else 	if (bt->setID == IPFIX_SetId_OptionsTemplate) {  		if (optionsRecordCallbackFunction == 0) return;  			OptionsTemplateInfo* ti = bt->optionsTemplateInfo;		uint16 length = ntoh(set->length)-((byte*)(&set->data)-(byte*)set);		byte* record = &set->data;			if (bt->recordLength < 65535) {			byte* recordX = record+length;			while (record < recordX) {				optionsRecordCallbackFunction(sourceId, ti, bt->recordLength, record);				record = record + bt->recordLength;				}			} else {			byte* recordX = record+length;			while (record < recordX) {				int recordLength=0;				int i;				for (i = 0; i < ti->scopeCount; i++) {					int fieldLength = 0;					if (ti->scopeInfo[i].typeX.length < 65535) {						fieldLength = ti->scopeInfo[i].typeX.length;						} else {						if (*(byte*)record < 255) {							fieldLength = *(byte*)record;							} else {							fieldLength = *(uint16*)(record+1);							}						}					ti->scopeInfo[i].typeX.length = fieldLength;					ti->scopeInfo[i].offset = recordLength;					recordLength += fieldLength;					}				for (i = 0; i < ti->fieldCount; i++) {					int fieldLength = 0;					if (ti->fieldInfo[i].typeX.length < 65535) {						fieldLength = ti->fieldInfo[i].typeX.length;						} else {						if (*(byte*)record < 255) {							fieldLength = *(byte*)record;							} else {							fieldLength = *(uint16*)(record+1);							}						}					ti->fieldInfo[i].typeX.length = fieldLength;					ti->fieldInfo[i].offset = recordLength;					recordLength += fieldLength;					}				optionsRecordCallbackFunction(sourceId, ti, recordLength, record);				record = record + recordLength;				}			}		} else   	if (bt->setID == IPFIX_SetId_DataTemplate) {  		if (dataDataRecordCallbackFunction == 0) return;  			DataTemplateInfo* ti = bt->dataTemplateInfo;		uint16 length = ntoh(set->length)-((byte*)(&set->data)-(byte*)set);		byte* record = &set->data;		if (bt->recordLength < 65535) {			byte* recordX = record+length;			while (record < recordX) {				dataDataRecordCallbackFunction(sourceId, ti, bt->recordLength, record);				record = record + bt->recordLength;				}			} else {			byte* recordX = record+length;			while (record < recordX) {				int recordLength=0;				int i;				for (i = 0; i < ti->fieldCount; i++) {					int fieldLength = 0;					if (ti->fieldInfo[i].typeX.length < 65535) {						fieldLength = ti->fieldInfo[i].typeX.length;						} else {						if (*(byte*)record < 255) {							fieldLength = *(byte*)record;							} else {							fieldLength = *(uint16*)(record+1);							}						}					ti->fieldInfo[i].typeX.length = fieldLength;					ti->fieldInfo[i].offset = recordLength;					recordLength += fieldLength;					}				dataDataRecordCallbackFunction(sourceId, ti, recordLength, record);				record = record + recordLength;				}			}		} else {		fatalf("Data Set based on known but unhandled template type %d", bt->setID);		}	}