mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-05 22:29:49 +00:00
Added newlines in debug output, small optimalisations, more work on 'getnext', fixed 'get' on udp table.
This commit is contained in:
parent
130d39cc03
commit
56c5fdbeaf
@ -4,6 +4,8 @@
|
||||
*
|
||||
* @note the object identifiers for this MIB-2 and private MIB tree
|
||||
* must be kept in sorted ascending order. This to ensure correct getnext operation.
|
||||
*
|
||||
* @todo optimize htonl, ntohl.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -1200,6 +1202,9 @@ void snmp_delete_ipaddridx_tree(struct netif *ni)
|
||||
*
|
||||
* @param dflt non-zero for the default rte, zero for network rte
|
||||
* @param netif points to network interface for this rte
|
||||
*
|
||||
* @todo record sysuptime for _this_ route when it is installed
|
||||
* (needed for ipRouteAge) in the netif.
|
||||
*/
|
||||
void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
|
||||
{
|
||||
@ -2225,11 +2230,6 @@ ifentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
* @param ident_len the address length (6)
|
||||
* @param ident points to objectname.atifindex.atnetaddress
|
||||
* @param od points to object definition.
|
||||
*
|
||||
* @todo std says objects are writeable, can we ignore it?
|
||||
*
|
||||
* @todo the etharp_find_addr could be a lot smarter
|
||||
* if our arp index tree provided pointers or index to the requested item
|
||||
*/
|
||||
static void
|
||||
atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
@ -2239,17 +2239,6 @@ atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
ident -= 5;
|
||||
|
||||
if (ident_len == 6)
|
||||
{
|
||||
struct eth_addr* ethaddr_ret;
|
||||
struct ip_addr* ipaddr_ret;
|
||||
struct ip_addr ip;
|
||||
struct netif *netif;
|
||||
|
||||
snmp_ifindextonetif(ident[1], &netif);
|
||||
snmp_oidtoip(&ident[2], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
|
||||
if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1)
|
||||
{
|
||||
od->id_inst_len = ident_len;
|
||||
od->id_inst_ptr = ident;
|
||||
@ -2261,21 +2250,18 @@ atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
od->access = MIB_OBJECT_READ_WRITE;
|
||||
od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
|
||||
od->v_len = sizeof(s32_t);
|
||||
od->addr = NULL;
|
||||
break;
|
||||
case 2: /* atPhysAddress */
|
||||
od->instance = MIB_OBJECT_TAB;
|
||||
od->access = MIB_OBJECT_READ_WRITE;
|
||||
od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
|
||||
od->v_len = sizeof(struct eth_addr);
|
||||
od->addr = ethaddr_ret;
|
||||
break;
|
||||
case 3: /* atNetAddress */
|
||||
od->instance = MIB_OBJECT_TAB;
|
||||
od->access = MIB_OBJECT_READ_WRITE;
|
||||
od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
|
||||
od->v_len = 4;
|
||||
od->addr = ipaddr_ret;
|
||||
break;
|
||||
default:
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no such object"));
|
||||
@ -2289,19 +2275,28 @@ atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no scalar"));
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo the etharp_find_addr could be a lot smarter
|
||||
* if our arp index tree provided pointers or index to the requested item
|
||||
*/
|
||||
static void
|
||||
atentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
{
|
||||
u8_t id;
|
||||
struct eth_addr* ethaddr_ret;
|
||||
struct ip_addr* ipaddr_ret;
|
||||
struct ip_addr ip;
|
||||
struct netif *netif;
|
||||
|
||||
if (len) {}
|
||||
|
||||
snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
|
||||
snmp_oidtoip(&od->id_inst_ptr[2], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
|
||||
if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1)
|
||||
{
|
||||
id = od->id_inst_ptr[0];
|
||||
switch (id)
|
||||
{
|
||||
@ -2314,21 +2309,20 @@ atentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
case 2: /* atPhysAddress */
|
||||
{
|
||||
struct eth_addr *dst = value;
|
||||
struct eth_addr *src = od->addr;
|
||||
|
||||
*dst = *src;
|
||||
*dst = *ethaddr_ret;
|
||||
}
|
||||
break;
|
||||
case 3: /* atNetAddress */
|
||||
{
|
||||
struct ip_addr *dst = value;
|
||||
struct ip_addr *src = od->addr;
|
||||
|
||||
*dst = *src;
|
||||
*dst = *ipaddr_ret;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
@ -2547,25 +2541,11 @@ ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
ident -= 4;
|
||||
|
||||
if (ident_len == 5)
|
||||
{
|
||||
struct ip_addr ip;
|
||||
struct netif *netif = netif_list;
|
||||
|
||||
snmp_oidtoip(&ident[1], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
|
||||
while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
|
||||
{
|
||||
netif = netif->next;
|
||||
}
|
||||
|
||||
if (netif != NULL)
|
||||
{
|
||||
u8_t id;
|
||||
|
||||
od->id_inst_len = ident_len;
|
||||
od->id_inst_ptr = ident;
|
||||
od->addr = netif;
|
||||
|
||||
id = ident[0];
|
||||
switch (id)
|
||||
@ -2597,57 +2577,46 @@ ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no scalar"));
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
{
|
||||
u8_t id;
|
||||
u16_t ifidx;
|
||||
struct ip_addr ip;
|
||||
struct netif *netif = netif_list;
|
||||
|
||||
if (len) {}
|
||||
snmp_oidtoip(&od->id_inst_ptr[1], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
ifidx = 0;
|
||||
while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
|
||||
{
|
||||
netif = netif->next;
|
||||
ifidx++;
|
||||
}
|
||||
|
||||
if (netif != NULL)
|
||||
{
|
||||
id = od->id_inst_ptr[0];
|
||||
switch (id)
|
||||
{
|
||||
case 1: /* ipAdEntAddr */
|
||||
{
|
||||
struct ip_addr *dst = value;
|
||||
struct netif *netif;
|
||||
struct ip_addr *src;
|
||||
|
||||
netif = od->addr;
|
||||
src = &netif->ip_addr;
|
||||
*dst = *src;
|
||||
*dst = netif->ip_addr;
|
||||
}
|
||||
break;
|
||||
case 2: /* ipAdEntIfIndex */
|
||||
{
|
||||
s32_t *sint_ptr = value;
|
||||
struct netif *netif = netif_list;
|
||||
u16_t i;
|
||||
|
||||
i = 0;
|
||||
while ((netif != NULL) && (netif != od->addr))
|
||||
{
|
||||
netif = netif->next;
|
||||
i++;
|
||||
}
|
||||
*sint_ptr = i + 1;
|
||||
*sint_ptr = ifidx + 1;
|
||||
}
|
||||
break;
|
||||
case 3: /* ipAdEntNetMask */
|
||||
{
|
||||
struct ip_addr *dst = value;
|
||||
struct netif *netif;
|
||||
struct ip_addr *src;
|
||||
|
||||
netif = od->addr;
|
||||
src = &netif->netmask;
|
||||
*dst = *src;
|
||||
*dst = netif->netmask;
|
||||
}
|
||||
break;
|
||||
case 4: /* ipAdEntBcastAddr */
|
||||
@ -2673,6 +2642,7 @@ ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @note
|
||||
@ -2689,33 +2659,9 @@ ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
ident -= 4;
|
||||
|
||||
if (ident_len == 5)
|
||||
{
|
||||
struct ip_addr dest;
|
||||
struct netif *netif;
|
||||
|
||||
snmp_oidtoip(&ident[1], &dest);
|
||||
dest.addr = htonl(dest.addr);
|
||||
|
||||
if (dest.addr == 0)
|
||||
{
|
||||
/* ip_route() uses default netif for default route */
|
||||
netif = netif_default;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* not using ip_route(), need exact match! */
|
||||
netif = netif_list;
|
||||
while ((netif != NULL) &&
|
||||
!ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
|
||||
{
|
||||
netif = netif->next;
|
||||
}
|
||||
}
|
||||
if (netif != NULL)
|
||||
{
|
||||
od->id_inst_len = ident_len;
|
||||
od->id_inst_ptr = ident;
|
||||
od->addr = netif;
|
||||
|
||||
id = ident[0];
|
||||
switch (id)
|
||||
@ -2766,12 +2712,6 @@ ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no scalar"));
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
@ -2781,12 +2721,27 @@ ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
s32_t *ident;
|
||||
u8_t id;
|
||||
|
||||
netif = od->addr;
|
||||
ident = od->id_inst_ptr;
|
||||
|
||||
snmp_oidtoip(&ident[1], &dest);
|
||||
dest.addr = htonl(dest.addr);
|
||||
|
||||
if (dest.addr == 0)
|
||||
{
|
||||
/* ip_route() uses default netif for default route */
|
||||
netif = netif_default;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* not using ip_route(), need exact match! */
|
||||
netif = netif_list;
|
||||
while ((netif != NULL) &&
|
||||
!ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
|
||||
{
|
||||
netif = netif->next;
|
||||
}
|
||||
}
|
||||
if (netif != NULL)
|
||||
{
|
||||
id = ident[0];
|
||||
switch (id)
|
||||
{
|
||||
@ -2808,17 +2763,9 @@ ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
break;
|
||||
case 2: /* ipRouteIfIndex */
|
||||
{
|
||||
struct netif *ni = netif_list;
|
||||
s32_t *sint_ptr = value;
|
||||
u16_t i;
|
||||
|
||||
i = 0;
|
||||
while ((ni != NULL) && (ni != netif))
|
||||
{
|
||||
ni = ni->next;
|
||||
i++;
|
||||
}
|
||||
*sint_ptr = i + 1;
|
||||
snmp_netiftoifindex(netif, sint_ptr);
|
||||
}
|
||||
break;
|
||||
case 3: /* ipRouteMetric1 */
|
||||
@ -2889,7 +2836,8 @@ ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
case 10: /* ipRouteAge */
|
||||
{
|
||||
s32_t *sint_ptr = value;
|
||||
/** @todo (sysuptime - timestamp last change) / 100 */
|
||||
/** @todo (sysuptime - timestamp last change) / 100
|
||||
@see snmp_insert_iprteidx_tree() */
|
||||
*sint_ptr = 0;
|
||||
}
|
||||
break;
|
||||
@ -2914,6 +2862,7 @@ ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
@ -2923,17 +2872,6 @@ ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
ident -= 5;
|
||||
|
||||
if (ident_len == 6)
|
||||
{
|
||||
struct eth_addr* ethaddr_ret;
|
||||
struct ip_addr* ipaddr_ret;
|
||||
struct ip_addr ip;
|
||||
struct netif *netif;
|
||||
|
||||
snmp_ifindextonetif(ident[1], &netif);
|
||||
snmp_oidtoip(&ident[2], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
|
||||
if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1)
|
||||
{
|
||||
u8_t id;
|
||||
|
||||
@ -2949,21 +2887,18 @@ ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
od->access = MIB_OBJECT_READ_WRITE;
|
||||
od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
|
||||
od->v_len = sizeof(s32_t);
|
||||
od->addr = NULL;
|
||||
break;
|
||||
case 2: /* ipNetToMediaPhysAddress */
|
||||
od->instance = MIB_OBJECT_TAB;
|
||||
od->access = MIB_OBJECT_READ_WRITE;
|
||||
od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
|
||||
od->v_len = sizeof(struct eth_addr);
|
||||
od->addr = ethaddr_ret;
|
||||
break;
|
||||
case 3: /* ipNetToMediaNetAddress */
|
||||
od->instance = MIB_OBJECT_TAB;
|
||||
od->access = MIB_OBJECT_READ_WRITE;
|
||||
od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
|
||||
od->v_len = 4;
|
||||
od->addr = ipaddr_ret;
|
||||
break;
|
||||
default:
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no such object"));
|
||||
@ -2977,19 +2912,24 @@ ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no scalar"));
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
{
|
||||
u8_t id;
|
||||
struct eth_addr* ethaddr_ret;
|
||||
struct ip_addr* ipaddr_ret;
|
||||
struct ip_addr ip;
|
||||
struct netif *netif;
|
||||
|
||||
if (len) {}
|
||||
|
||||
snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
|
||||
snmp_oidtoip(&od->id_inst_ptr[2], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
|
||||
if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1)
|
||||
{
|
||||
id = od->id_inst_ptr[0];
|
||||
switch (id)
|
||||
{
|
||||
@ -3002,17 +2942,15 @@ ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
case 2: /* ipNetToMediaPhysAddress */
|
||||
{
|
||||
struct eth_addr *dst = value;
|
||||
struct eth_addr *src = od->addr;
|
||||
|
||||
*dst = *src;
|
||||
*dst = *ethaddr_ret;
|
||||
}
|
||||
break;
|
||||
case 3: /* ipNetToMediaNetAddress */
|
||||
{
|
||||
struct ip_addr *dst = value;
|
||||
struct ip_addr *src = od->addr;
|
||||
|
||||
*dst = *src;
|
||||
*dst = *ipaddr_ret;
|
||||
}
|
||||
break;
|
||||
case 4: /* ipNetToMediaType */
|
||||
@ -3024,6 +2962,7 @@ ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
@ -3272,22 +3211,13 @@ tcp_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
static void
|
||||
tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
{
|
||||
/** @todo adjust ident_len and ident after table index traversal */
|
||||
/* return to object name, adding index depth (10) */
|
||||
ident_len += 10;
|
||||
ident -= 10;
|
||||
|
||||
if (ident_len == 11)
|
||||
{
|
||||
u8_t id;
|
||||
struct ip_addr lip, rip;
|
||||
u16_t lport, rport;
|
||||
|
||||
snmp_oidtoip(&ident[1], &lip);
|
||||
lip.addr = htonl(lip.addr);
|
||||
lport = ident[5];
|
||||
snmp_oidtoip(&ident[6], &rip);
|
||||
rip.addr = htonl(rip.addr);
|
||||
rport = ident[10];
|
||||
|
||||
/** @todo find matching PCB */
|
||||
|
||||
od->id_inst_len = ident_len;
|
||||
od->id_inst_ptr = ident;
|
||||
@ -3333,6 +3263,19 @@ tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
static void
|
||||
tcpconnentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
{
|
||||
struct ip_addr lip, rip;
|
||||
u16_t lport, rport;
|
||||
s32_t *ident;
|
||||
|
||||
ident = od->id_inst_ptr;
|
||||
snmp_oidtoip(&ident[1], &lip);
|
||||
lip.addr = htonl(lip.addr);
|
||||
lport = ident[5];
|
||||
snmp_oidtoip(&ident[6], &rip);
|
||||
rip.addr = htonl(rip.addr);
|
||||
rport = ident[10];
|
||||
|
||||
/** @todo find matching PCB */
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -3390,29 +3333,9 @@ udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
ident -= 5;
|
||||
|
||||
if (ident_len == 6)
|
||||
{
|
||||
struct udp_pcb *pcb;
|
||||
struct ip_addr ip;
|
||||
u16_t port;
|
||||
|
||||
snmp_oidtoip(&ident[1], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
|
||||
port = ident[5];
|
||||
|
||||
pcb = udp_pcbs;
|
||||
while ((pcb != NULL) &&
|
||||
(pcb->local_ip.addr != ip.addr) &&
|
||||
(pcb->local_port != port))
|
||||
{
|
||||
pcb = pcb->next;
|
||||
}
|
||||
|
||||
if (pcb != NULL)
|
||||
{
|
||||
od->id_inst_len = ident_len;
|
||||
od->id_inst_ptr = ident;
|
||||
od->addr = pcb;
|
||||
|
||||
switch (ident[0])
|
||||
{
|
||||
@ -3440,29 +3363,37 @@ udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no scalar"));
|
||||
od->instance = MIB_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
udpentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
{
|
||||
struct udp_pcb *pcb;
|
||||
u8_t id;
|
||||
struct udp_pcb *pcb;
|
||||
struct ip_addr ip;
|
||||
u16_t port;
|
||||
|
||||
if (len){}
|
||||
pcb = od->addr;
|
||||
snmp_oidtoip(&od->id_inst_ptr[1], &ip);
|
||||
ip.addr = htonl(ip.addr);
|
||||
port = od->id_inst_ptr[5];
|
||||
|
||||
pcb = udp_pcbs;
|
||||
while ((pcb != NULL) &&
|
||||
!((pcb->local_ip.addr == ip.addr) &&
|
||||
(pcb->local_port == port)))
|
||||
{
|
||||
pcb = pcb->next;
|
||||
}
|
||||
|
||||
if (pcb != NULL)
|
||||
{
|
||||
id = od->id_inst_ptr[0];
|
||||
switch (id)
|
||||
{
|
||||
case 1: /* udpLocalAddress */
|
||||
{
|
||||
struct ip_addr *dst = value;
|
||||
struct ip_addr *src = &pcb->local_ip;
|
||||
*dst = *src;
|
||||
*dst = pcb->local_ip;
|
||||
}
|
||||
break;
|
||||
case 2: /* udpLocalPort */
|
||||
@ -3473,6 +3404,7 @@ udpentry_get_value(struct obj_def *od, u16_t len, void *value)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
|
||||
|
@ -129,13 +129,16 @@ snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
|
||||
void
|
||||
snmp_oidtoip(s32_t *ident, struct ip_addr *ip)
|
||||
{
|
||||
ip->addr = ident[0];
|
||||
ip->addr <<= 8;
|
||||
ip->addr |= ident[1];
|
||||
ip->addr <<= 8;
|
||||
ip->addr |= ident[2];
|
||||
ip->addr <<= 8;
|
||||
ip->addr |= ident[3];
|
||||
u32_t ipa;
|
||||
|
||||
ipa = ident[0];
|
||||
ipa <<= 8;
|
||||
ipa |= ident[1];
|
||||
ipa <<= 8;
|
||||
ipa |= ident[2];
|
||||
ipa <<= 8;
|
||||
ipa |= ident[3];
|
||||
ip->addr = ipa;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -146,16 +149,13 @@ snmp_oidtoip(s32_t *ident, struct ip_addr *ip)
|
||||
void
|
||||
snmp_iptooid(struct ip_addr *ip, s32_t *ident)
|
||||
{
|
||||
u8_t trnc;
|
||||
u32_t ipa;
|
||||
|
||||
trnc = ip->addr >> 24;
|
||||
ident[0] = trnc & 0xff;
|
||||
trnc = ip->addr >> 16;
|
||||
ident[1] = trnc & 0xff;
|
||||
trnc = ip->addr >> 8;
|
||||
ident[2] = trnc & 0xff;
|
||||
trnc = ip->addr;
|
||||
ident[3] = trnc & 0xff;
|
||||
ipa = ip->addr;
|
||||
ident[0] = (ipa >> 24) & 0xff;
|
||||
ident[1] = (ipa >> 16) & 0xff;
|
||||
ident[2] = (ipa >> 8) & 0xff;
|
||||
ident[3] = ipa & 0xff;
|
||||
}
|
||||
|
||||
struct mib_list_node *
|
||||
@ -451,7 +451,7 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
{
|
||||
u8_t node_type;
|
||||
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F,(void*)node,*ident));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
|
||||
while (node != NULL)
|
||||
{
|
||||
node_type = node->node_type;
|
||||
@ -472,7 +472,7 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
if (i < an->maxlength)
|
||||
{
|
||||
/* found it, if available proceed to child, otherwise inspect leaf */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F,i,an->objid[i],*ident));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
|
||||
if (an->nptr[i] == NULL)
|
||||
{
|
||||
/* a scalar leaf OR table,
|
||||
@ -488,7 +488,7 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
else
|
||||
{
|
||||
/* search failed, object id points to unknown object (nosuchname) */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, object not in this MIB"));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, object not in this MIB\n"));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@ -503,14 +503,14 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
else
|
||||
{
|
||||
/* search failed, identifier mismatch (nosuchname) */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F,*ident));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F"\n",*ident));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* search failed, short object identifier (nosuchname) */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier"));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier\n"));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@ -532,7 +532,7 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
if (ln != NULL)
|
||||
{
|
||||
/* found it, proceed to child */;
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F,ln->objid,*ident));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
|
||||
if (ln->nptr == NULL)
|
||||
{
|
||||
lrn->get_object_def(ident_len, ident, object_def);
|
||||
@ -559,14 +559,14 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
else
|
||||
{
|
||||
/* search failed */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F,*ident));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F"\n",*ident));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* search failed, short object identifier (nosuchname) */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier"));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier\n"));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@ -604,26 +604,26 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
else
|
||||
{
|
||||
/* search failed */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F,*ident));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed *ident==%"S32_F"\n",*ident));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* search failed, short object identifier (nosuchname) */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier"));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, short object identifier\n"));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* unknown node_type */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node_type %"U16_F" unkown",(u16_t)node_type));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node_type %"U16_F" unkown\n",(u16_t)node_type));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/* done, found nothing */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p",(void*)node));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -636,19 +636,19 @@ snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct obj
|
||||
struct mib_node *
|
||||
snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
|
||||
{
|
||||
u8_t node_type;
|
||||
u8_t node_type, climb_tree;
|
||||
|
||||
/* reset stack */
|
||||
node_stack_cnt = 0;
|
||||
|
||||
while (node != NULL)
|
||||
{
|
||||
climb_tree = 0;
|
||||
node_type = node->node_type;
|
||||
if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
|
||||
{
|
||||
struct mib_array_node *an;
|
||||
u16_t i;
|
||||
u8_t climb_tree;
|
||||
|
||||
/* array node (internal ROM or RAM, fixed length) */
|
||||
an = (struct mib_array_node *)node;
|
||||
@ -661,22 +661,21 @@ snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snm
|
||||
}
|
||||
if (i < an->maxlength)
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F,i,an->objid[i],*ident));
|
||||
|
||||
climb_tree = 0;
|
||||
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
|
||||
/* add identifier to oidret */
|
||||
oidret->id[oidret->len] = an->objid[i];
|
||||
(oidret->len)++;
|
||||
|
||||
if (an->nptr[i] == NULL)
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
|
||||
/* leaf node,
|
||||
if scalar: if ident_len == 1 add '.0', nextThing.0 otherwise */
|
||||
if (ident_len == 1)
|
||||
{
|
||||
oidret->id[oidret->len] = 0;
|
||||
(oidret->len)++;
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ident_len == 1, added .0\n"));
|
||||
return (struct mib_node*)an;
|
||||
}
|
||||
else if ((i + 1) < an->maxlength)
|
||||
@ -684,11 +683,37 @@ snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snm
|
||||
(oidret->len)--;
|
||||
oidret->id[oidret->len] = an->objid[i + 1];
|
||||
(oidret->len)++;
|
||||
if (an->nptr[i + 1] == NULL)
|
||||
{
|
||||
oidret->id[oidret->len] = 0;
|
||||
(oidret->len)++;
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("(i + 1) < an->maxlength\n"));
|
||||
return (struct mib_node*)an;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct nse cur_node;
|
||||
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
|
||||
/* non-leaf, store right child ptr and id */
|
||||
if ((i + 2) < an->maxlength)
|
||||
{
|
||||
cur_node.r_ptr = an->nptr[i + 2];
|
||||
cur_node.r_id = an->objid[i + 2];
|
||||
}
|
||||
else
|
||||
{
|
||||
cur_node.r_ptr = NULL;
|
||||
}
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand, push_node() node=%p id=%"S32_F"\n",(void*)cur_node.r_ptr,cur_node.r_id));
|
||||
push_node(&cur_node);
|
||||
/* follow next child pointer */
|
||||
ident_len--;
|
||||
ident++;
|
||||
node = an->nptr[i+1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
(oidret->len)--;
|
||||
climb_tree = 1;
|
||||
@ -698,6 +723,7 @@ snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snm
|
||||
{
|
||||
struct nse cur_node;
|
||||
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
|
||||
/* non-leaf, store right child ptr and id */
|
||||
if ((i + 1) < an->maxlength)
|
||||
{
|
||||
@ -708,7 +734,7 @@ snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snm
|
||||
{
|
||||
cur_node.r_ptr = NULL;
|
||||
}
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand, push_node() node=%p id=%"S32_F,(void*)cur_node.r_ptr,cur_node.r_id));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand, push_node() node=%p id=%"S32_F"\n",(void*)cur_node.r_ptr,cur_node.r_id));
|
||||
push_node(&cur_node);
|
||||
/* follow next child pointer */
|
||||
ident_len--;
|
||||
@ -721,35 +747,6 @@ snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snm
|
||||
/* i == an->maxlength */
|
||||
climb_tree = 1;
|
||||
}
|
||||
|
||||
if (climb_tree)
|
||||
{
|
||||
struct nse child;
|
||||
|
||||
/* find right child ptr */
|
||||
child.r_ptr = NULL;
|
||||
while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
|
||||
{
|
||||
pop_node(&child);
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand, pop_node() node=%p id=%"S32_F,(void *)child.r_ptr, child.r_id));
|
||||
/* trim returned oid */
|
||||
(oidret->len)--;
|
||||
}
|
||||
if (child.r_ptr != NULL)
|
||||
{
|
||||
/* incoming ident is useless beyond this point */
|
||||
ident_len = 0;
|
||||
oidret->id[oidret->len] = child.r_id;
|
||||
oidret->len++;
|
||||
node = child.r_ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* tree ends here ... */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed, tree ends here"));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -775,16 +772,129 @@ snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snm
|
||||
else if(node_type == MIB_NODE_LR)
|
||||
{
|
||||
/** @todo need this for indexing tables */
|
||||
struct mib_list_rootnode *lrn;
|
||||
struct mib_list_node *ln;
|
||||
|
||||
/* list root node (internal 'RAM', variable length) */
|
||||
lrn = (struct mib_list_rootnode *)node;
|
||||
if (ident_len > 0)
|
||||
{
|
||||
ln = lrn->head;
|
||||
/* iterate over list, head to tail */
|
||||
while ((ln != NULL) && (ln->objid < *ident))
|
||||
{
|
||||
ln = ln->next;
|
||||
}
|
||||
if (ln != NULL)
|
||||
{
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
|
||||
oidret->id[oidret->len] = ln->objid;
|
||||
(oidret->len)++;
|
||||
if (ln->nptr == NULL)
|
||||
{
|
||||
/* leaf node */
|
||||
/** @todo if scalar: if ident_len == 1 add '.0', nextThing.0 otherwise */
|
||||
if (ln->next != NULL)
|
||||
{
|
||||
(oidret->len)--;
|
||||
oidret->id[oidret->len] = ln->next->objid;
|
||||
(oidret->len)++;
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->next != NULL\n"));
|
||||
return (struct mib_node*)lrn;
|
||||
}
|
||||
else
|
||||
{
|
||||
(oidret->len)--;
|
||||
climb_tree = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
struct nse cur_node;
|
||||
|
||||
/* non-leaf, store right child ptr and id */
|
||||
if (ln->next != NULL)
|
||||
{
|
||||
cur_node.r_ptr = ln->next->nptr;
|
||||
cur_node.r_id = ln->next->objid;
|
||||
}
|
||||
else
|
||||
{
|
||||
cur_node.r_ptr = NULL;
|
||||
}
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand, push_node() node=%p id=%"S32_F"\n",(void*)cur_node.r_ptr,cur_node.r_id));
|
||||
push_node(&cur_node);
|
||||
/* follow next child pointer */
|
||||
ident_len--;
|
||||
ident++;
|
||||
node = ln->nptr;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ln == NULL */
|
||||
climb_tree = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ident_len == 0, complete object identifier */
|
||||
/* add leftmost '.thing' */
|
||||
oidret->id[oidret->len] = lrn->head->objid;
|
||||
(oidret->len)++;
|
||||
if (lrn->head->nptr == NULL)
|
||||
{
|
||||
/* leaf node */
|
||||
/* @todo problem: if scalar add .0 */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("lrn->head->nptr == NULL\n"));
|
||||
return (struct mib_node*)lrn;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* no leaf, continue */
|
||||
node = lrn->head->nptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* unknown/unhandled node_type */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown",(u16_t)node_type));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (climb_tree)
|
||||
{
|
||||
struct nse child;
|
||||
|
||||
/* find right child ptr */
|
||||
child.r_ptr = NULL;
|
||||
while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
|
||||
{
|
||||
pop_node(&child);
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand, pop_node() node=%p id=%"S32_F"\n",(void *)child.r_ptr, child.r_id));
|
||||
/* trim returned oid */
|
||||
(oidret->len)--;
|
||||
}
|
||||
if (child.r_ptr != NULL)
|
||||
{
|
||||
/* incoming ident is useless beyond this point */
|
||||
ident_len = 0;
|
||||
oidret->id[oidret->len] = child.r_id;
|
||||
oidret->len++;
|
||||
node = child.r_ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* tree ends here ... */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed, tree ends here\n"));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* done, found nothing */
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p",(void*)node));
|
||||
LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -73,8 +73,6 @@ struct obj_def
|
||||
u8_t id_inst_len;
|
||||
/* instance part of supplied object identifier */
|
||||
s32_t *id_inst_ptr;
|
||||
/* optional value address hint */
|
||||
void *addr;
|
||||
};
|
||||
|
||||
/** MIB const array node */
|
||||
|
Loading…
Reference in New Issue
Block a user