diff --git a/include/dbcache.h b/include/dbcache.h
index 10856c6..b4788b2 100644
--- a/include/dbcache.h
+++ b/include/dbcache.h
@@ -97,6 +97,15 @@ typedef struct
 }
 DC_INTERFACE2;
 
+typedef struct
+{
+	unsigned char	version;
+	unsigned char	bulk;
+	unsigned char	max_succeed;
+	unsigned char	min_fail;
+}
+DC_INTERFACE_SNMP;
+
 typedef struct
 {
 	zbx_uint64_t	hostid;
@@ -982,4 +991,7 @@ const char	*zbx_dc_get_instanceid(void);
 
 char	*zbx_dc_expand_user_macros_in_func_params(const char *params, zbx_uint64_t hostid);
 
+int	zbx_dc_get_host_interfaces_by_type(zbx_uint64_t hostid, unsigned char interface_type,
+		DC_INTERFACE **interfaces, void **extra);
+
 #endif
diff --git a/src/libs/zbxdbcache/dbconfig.c b/src/libs/zbxdbcache/dbconfig.c
index e225a52..5899cb2 100644
--- a/src/libs/zbxdbcache/dbconfig.c
+++ b/src/libs/zbxdbcache/dbconfig.c
@@ -12858,6 +12858,69 @@ char	*dc_expand_user_macros_in_calcitem(const char *formula, zbx_uint64_t hostid
 	return exp;
 }
 
+int	zbx_dc_get_host_interfaces_by_type(zbx_uint64_t hostid, unsigned char interface_type,
+		DC_INTERFACE **interfaces, void **extra)
+{
+	ZBX_DC_HOST		*dc_host;
+	int			num = 0;
+	ZBX_DC_INTERFACE	*dc_interface;
+	DC_INTERFACE_SNMP	*snmp;
+
+	RDLOCK_CACHE;
+
+	if (NULL != (dc_host = (ZBX_DC_HOST *)zbx_hashset_search(&config->hosts, &hostid)))
+	{
+		int	i;
+
+		for (i = 0; i < dc_host->interfaces_v.values_num; i++)
+		{
+			dc_interface = (ZBX_DC_INTERFACE *)dc_host->interfaces_v.values[i];
+			if (dc_interface->type == interface_type)
+				num++;
+		}
+
+		if (0 != num)
+		{
+			int	j;
+
+			*interfaces = (DC_INTERFACE *)zbx_malloc(NULL, sizeof(DC_INTERFACE) * num);
+
+			if (INTERFACE_TYPE_SNMP == interface_type)
+			{
+				snmp = (DC_INTERFACE_SNMP *)zbx_malloc(NULL, sizeof(DC_INTERFACE_SNMP) * num);
+				memset(snmp, 0, sizeof(DC_INTERFACE_SNMP) * num);
+				*extra = snmp;
+			}
+
+			for (i = 0, j = 0; i < dc_host->interfaces_v.values_num; i++)
+			{
+				dc_interface = (ZBX_DC_INTERFACE *)dc_host->interfaces_v.values[i];
+
+				if (dc_interface->type == interface_type)
+				{
+					ZBX_DC_SNMPINTERFACE *dc_snmp;
+
+					DCget_interface(&(*interfaces)[j], dc_interface);
+
+					if (NULL != (dc_snmp = (ZBX_DC_SNMPINTERFACE *)zbx_hashset_search(
+							&config->interfaces_snmp, &dc_interface->interfaceid)))
+					{
+						snmp[j].version = dc_snmp->version;
+						snmp[j].bulk = dc_snmp->bulk;
+						snmp[j].max_succeed = dc_snmp->max_succeed;
+						snmp[j].min_fail = dc_snmp->min_fail;
+					}
+					j++;
+				}
+			}
+		}
+	}
+
+	UNLOCK_CACHE;
+
+	return num;
+}
+
 #ifdef HAVE_TESTS
 #	include "../../../tests/libs/zbxdbcache/dc_item_poller_type_update_test.c"
 #endif
diff --git a/src/zabbix_server/poller/checks_internal.c b/src/zabbix_server/poller/checks_internal.c
index d4a5706..a223844 100644
--- a/src/zabbix_server/poller/checks_internal.c
+++ b/src/zabbix_server/poller/checks_internal.c
@@ -169,6 +169,81 @@ static int	zbx_host_interfaces_discovery(zbx_uint64_t hostid, struct zbx_json *j
 	return SUCCEED;
 }
 
+static void	get_interface_info(zbx_uint64_t hostid, unsigned char interface_type, struct zbx_json *j)
+{
+	DC_INTERFACE	*interfaces = NULL;
+	void		*extra = NULL;
+	int		i, num;
+
+	num = zbx_dc_get_host_interfaces_by_type(hostid, interface_type, &interfaces, &extra);
+
+	for (i = 0; i < num; i++)
+	{
+		const char	*p;
+
+		zbx_json_addobject(j, NULL);
+		zbx_json_addint64(j, "id", interfaces[i].interfaceid);
+
+		zbx_json_addstring(j, "conn", interfaces[i].addr, ZBX_JSON_TYPE_STRING);
+		zbx_json_addstring(j, "ip", interfaces[i].ip_orig, ZBX_JSON_TYPE_STRING);
+		zbx_json_addstring(j, "dns", interfaces[i].dns_orig, ZBX_JSON_TYPE_STRING);
+		zbx_json_addstring(j, "port", interfaces[i].port_orig, ZBX_JSON_TYPE_STRING);
+
+		switch (interfaces[i].type)
+		{
+			case INTERFACE_TYPE_AGENT:
+				p = "AGENT";
+				break;
+			case INTERFACE_TYPE_SNMP:
+				p = "SNMP";
+				break;
+			case INTERFACE_TYPE_IPMI:
+				p = "IPMI";
+				break;
+			case INTERFACE_TYPE_JMX:
+				p = "JMX";
+				break;
+			case INTERFACE_TYPE_UNKNOWN:
+			default:
+				p = "UNKNOWN";
+		}
+		zbx_json_addstring(j, "type", p, ZBX_JSON_TYPE_STRING);
+
+		zbx_json_adduint64(j, "default", (zbx_uint64_t)interfaces[i].main);
+
+		if (INTERFACE_TYPE_SNMP == interfaces[i].type)
+		{
+			DC_INTERFACE_SNMP	*snmp = (DC_INTERFACE_SNMP *)extra;
+
+			zbx_json_adduint64(j, "snmp.bulk", (zbx_uint64_t)snmp[i].bulk);
+			zbx_json_adduint64(j, "snmp.max_succeed", (zbx_uint64_t)snmp[i].max_succeed);
+			zbx_json_adduint64(j, "snmp.min_fail", (zbx_uint64_t)snmp[i].min_fail);
+
+			switch (snmp[i].version)
+			{
+				case ZBX_IF_SNMP_VERSION_1:
+					p = "SNMPv1";
+					break;
+				case ZBX_IF_SNMP_VERSION_2:
+					p = "SNMPv2c";
+					break;
+				case ZBX_IF_SNMP_VERSION_3:
+					p = "SNMPv3";
+					break;
+				default:
+					p = "UNKNOWN";
+			}
+
+			zbx_json_addstring(j, "snmp.version", p, ZBX_JSON_TYPE_STRING);
+		}
+
+		zbx_json_close(j);
+	}
+
+	zbx_free(extra);
+	zbx_free(interfaces);
+}
+
 /******************************************************************************
  *                                                                            *
  * Function: get_value_internal                                               *
@@ -405,6 +480,22 @@ int	get_value_internal(const DC_ITEM *item, AGENT_RESULT *result)
 
 			zbx_json_free(&j);
 		}
+		else if (0 == strcmp(tmp, "info"))	/* zabbix["host","snmp","info"] */
+		{
+			struct zbx_json	j;
+
+			tmp = get_rparam(&request, 1);
+			if (0 != strcmp(tmp, "snmp"))
+			{
+				SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter."));
+				goto out;
+			}
+
+			zbx_json_initarray(&j, 1024);
+			get_interface_info(item->host.hostid, INTERFACE_TYPE_SNMP, &j);
+			SET_STR_RESULT(result, zbx_strdup(NULL, j.buffer));
+			zbx_json_free(&j);
+		}
 		else
 		{
 			SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter."));
