private static eBPFHelperDataTypes parseHelpFunctionDefs(Program program) {

		FunctionDefinition[] helperFunctionDefs =
			new FunctionDefinition[bpfHelperSignatures.length];

		DataType be16;
		DataType be32;

		boolean success = false;
		DataTypeManager dtm =
			new StandAloneDataTypeManager("BPF", DataOrganizationImpl.getDefaultOrganization());
		int txId = dtm.startTransaction("Parse Types");
		try {

			// Populate typedef dependencies (based upon eBPF.cspec and little-endian)
			dtm.addDataType(new TypedefDataType("u8", UnsignedCharDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("u16", UnsignedShortDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("u32", UnsignedIntegerDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("s32", IntegerDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("u64", UnsignedLongDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("s64", LongDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("__wsum", IntegerDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("__sum16", ShortDataType.dataType), null);
			dtm.addDataType(new TypedefDataType("size_t", UnsignedLongDataType.dataType), null);

			// Define big-endian typedefs - limited support within little-endian program
			be16 = dtm.addDataType(new TypedefDataType("__be16", UnsignedShortDataType.dataType),
				null);
			be32 = dtm.addDataType(new TypedefDataType("__be32", UnsignedIntegerDataType.dataType),
				null);

			CParser parser = new CParser(dtm, true, null);
			try {
				int id = 0;
				for (String def : bpfHelperSignatures) {
					helperFunctionDefs[id++] =
						def != null ? (FunctionDefinition) parser.parse(def + ";") : null;
				}
			}
			catch (ParseException e) {
				Msg.error(eBPFHelperDataTypes.class, "eBPF datatype parse error: " +
					e.getMessage() + "\n\n" + parser.getParseMessages());
				return null;
			}

			success = true;
		}
		finally {
			dtm.endTransaction(txId, true);
			if (!success) {
				dtm.close();
			}
		}

		// Add big-endian datatypes to program and set default setting.
		// This is done since endian settings do not carry through resolve
		program.withTransaction("Add BPF big-endian typedefs", () -> {
			ProgramBasedDataTypeManager programDtm = program.getDataTypeManager();
			setBigEndianFormat(programDtm.addDataType(be16, null));
			setBigEndianFormat(programDtm.addDataType(be32, null));
		});

		return new eBPFHelperDataTypes(dtm, helperFunctionDefs);
	}
Get the BPF helper datatypes which has been populated with helper function 
definitions and related dependency datatypes.  All structure dependencies are defined
as empty structures.  In addition, the big-endian typedefs {@code __be16} and 
{@code __be32} will be prepopulated within the program's datatype manager with
big-endian default setting enabled.

@param program target program
@param log analysis message log
@return BPF helper datatype or null if failed to initialize.
Ghidra/Processors/eBPF/src/main/java/ghidra/app/plugin/core/analysis/eBPFHelperDataTypes.java