48#if LWIP_SNMP && SNMP_LWIP_MIB2 && LWIP_TCP
51#define SYNC_NODE_NAME(node_name) node_name ## _synced
52#define CREATE_LWIP_SYNC_NODE(oid, node_name) \
53 static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);
55#define SYNC_NODE_NAME(node_name) node_name
56#define CREATE_LWIP_SYNC_NODE(oid, node_name)
62tcp_get_value(
struct snmp_node_instance *
instance,
void *
value)
70 return sizeof(*sint_ptr);
75 return sizeof(*sint_ptr);
80 return sizeof(*sint_ptr);
83 return sizeof(*sint_ptr);
85 *uint_ptr = STATS_GET(
mib2.tcpactiveopens);
86 return sizeof(*uint_ptr);
88 *uint_ptr = STATS_GET(
mib2.tcppassiveopens);
89 return sizeof(*uint_ptr);
91 *uint_ptr = STATS_GET(
mib2.tcpattemptfails);
92 return sizeof(*uint_ptr);
94 *uint_ptr = STATS_GET(
mib2.tcpestabresets);
95 return sizeof(*uint_ptr);
97 u16_t tcpcurrestab = 0;
98 struct tcp_pcb *pcb = tcp_active_pcbs;
100 if ((pcb->state == ESTABLISHED) ||
101 (pcb->state == CLOSE_WAIT)) {
106 *uint_ptr = tcpcurrestab;
108 return sizeof(*uint_ptr);
110 *uint_ptr = STATS_GET(
mib2.tcpinsegs);
111 return sizeof(*uint_ptr);
113 *uint_ptr = STATS_GET(
mib2.tcpoutsegs);
114 return sizeof(*uint_ptr);
116 *uint_ptr = STATS_GET(
mib2.tcpretranssegs);
117 return sizeof(*uint_ptr);
119 *uint_ptr = STATS_GET(
mib2.tcpinerrs);
120 return sizeof(*uint_ptr);
122 *uint_ptr = STATS_GET(
mib2.tcpoutrsts);
123 return sizeof(*uint_ptr);
127 u64_t val64 = STATS_GET(
mib2.tcpinsegs);
128 *((u64_t *)
value) = val64;
130 return sizeof(u64_t);
133 u64_t val64 = STATS_GET(
mib2.tcpoutsegs);
134 *((u64_t *)
value) = val64;
136 return sizeof(u64_t);
151static const struct snmp_oid_range tcp_ConnTable_oid_ranges[] = {
165tcp_ConnTable_get_cell_value_core(
struct tcp_pcb *pcb,
const u32_t *
column,
union snmp_variant_value *
value,
u32_t *value_len)
172 value->u32 = pcb->state + 1;
175 value->u32 = ip_2_ip4(&pcb->local_ip)->addr;
178 value->u32 = pcb->local_port;
181 if (pcb->state == LISTEN) {
182 value->u32 = IP4_ADDR_ANY4->addr;
184 value->u32 = ip_2_ip4(&pcb->remote_ip)->addr;
188 if (pcb->state == LISTEN) {
191 value->u32 = pcb->remote_port;
196 return SNMP_ERR_NOSUCHINSTANCE;
199 return SNMP_ERR_NOERROR;
207 ip4_addr_t remote_ip;
213 if (!snmp_oid_in_range(row_oid, row_oid_len, tcp_ConnTable_oid_ranges,
LWIP_ARRAYSIZE(tcp_ConnTable_oid_ranges))) {
214 return SNMP_ERR_NOSUCHINSTANCE;
218 snmp_oid_to_ip4(&row_oid[0], &local_ip);
219 local_port = (
u16_t)row_oid[4];
220 snmp_oid_to_ip4(&row_oid[5], &remote_ip);
221 remote_port = (
u16_t)row_oid[9];
225 pcb = *tcp_pcb_lists[
i];
227 while (pcb !=
NULL) {
230 ip4_addr_eq(&local_ip, ip_2_ip4(&pcb->local_ip)) && (local_port == pcb->local_port)) {
233 if (pcb->state == LISTEN) {
234 if (ip4_addr_eq(&remote_ip, IP4_ADDR_ANY4) && (remote_port == 0)) {
236 return tcp_ConnTable_get_cell_value_core(pcb,
column,
value, value_len);
240 ip4_addr_eq(&remote_ip, ip_2_ip4(&pcb->remote_ip)) && (remote_port == pcb->remote_port)) {
242 return tcp_ConnTable_get_cell_value_core(pcb,
column,
value, value_len);
252 return SNMP_ERR_NOSUCHINSTANCE;
256tcp_ConnTable_get_next_cell_instance_and_value(
const u32_t *
column,
struct snmp_obj_id *row_oid,
union snmp_variant_value *
value,
u32_t *value_len)
260 struct snmp_next_oid_state
state;
264 snmp_next_oid_init(&
state, row_oid->id, row_oid->len, result_temp,
LWIP_ARRAYSIZE(tcp_ConnTable_oid_ranges));
268 pcb = *tcp_pcb_lists[
i];
269 while (pcb !=
NULL) {
273 snmp_ip4_to_oid(ip_2_ip4(&pcb->local_ip), &test_oid[0]);
274 test_oid[4] = pcb->local_port;
277 if (pcb->state == LISTEN) {
278 snmp_ip4_to_oid(IP4_ADDR_ANY4, &test_oid[5]);
284 snmp_ip4_to_oid(ip_2_ip4(&pcb->remote_ip), &test_oid[5]);
285 test_oid[9] = pcb->remote_port;
297 if (
state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
298 snmp_oid_assign(row_oid,
state.next_oid,
state.next_oid_len);
300 return tcp_ConnTable_get_cell_value_core((
struct tcp_pcb *)
state.reference,
column,
value, value_len);
304 return SNMP_ERR_NOSUCHINSTANCE;
312tcp_ConnectionTable_get_cell_value_core(
const u32_t *
column,
struct tcp_pcb *pcb,
union snmp_variant_value *
value)
317 value->u32 = pcb->state + 1;
323 return SNMP_ERR_NOSUCHINSTANCE;
326 return SNMP_ERR_NOERROR;
333 u16_t local_port, remote_port;
337 struct tcp_pcb **
const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};
342 idx += snmp_oid_to_ip_port(&row_oid[
idx], row_oid_len -
idx, &local_ip, &local_port);
344 return SNMP_ERR_NOSUCHINSTANCE;
348 idx += snmp_oid_to_ip_port(&row_oid[
idx], row_oid_len -
idx, &remote_ip, &remote_port);
350 return SNMP_ERR_NOSUCHINSTANCE;
355 pcb = *tcp_pcb_nonlisten_lists[
i];
357 while (pcb !=
NULL) {
359 (local_port == pcb->local_port) &&
361 (remote_port == pcb->remote_port)) {
363 return tcp_ConnectionTable_get_cell_value_core(
column, pcb,
value);
370 return SNMP_ERR_NOSUCHINSTANCE;
374tcp_ConnectionTable_get_next_cell_instance_and_value(
const u32_t *
column,
struct snmp_obj_id *row_oid,
union snmp_variant_value *
value,
u32_t *value_len)
377 struct snmp_next_oid_state
state;
380 u32_t result_temp[38];
382 struct tcp_pcb **
const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};
387 snmp_next_oid_init(&
state, row_oid->id, row_oid->len, result_temp,
LWIP_ARRAYSIZE(result_temp));
391 pcb = *tcp_pcb_nonlisten_lists[
i];
393 while (pcb !=
NULL) {
398 idx += snmp_ip_port_to_oid(&pcb->local_ip, pcb->local_port, &test_oid[
idx]);
401 idx += snmp_ip_port_to_oid(&pcb->remote_ip, pcb->remote_port, &test_oid[
idx]);
404 snmp_next_oid_check(&
state, test_oid,
idx, pcb);
411 if (
state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
412 snmp_oid_assign(row_oid,
state.next_oid,
state.next_oid_len);
414 return tcp_ConnectionTable_get_cell_value_core(
column, (
struct tcp_pcb *)
state.reference,
value);
417 return SNMP_ERR_NOSUCHINSTANCE;
424tcp_ListenerTable_get_cell_value_core(
const u32_t *
column,
union snmp_variant_value *
value)
432 return SNMP_ERR_NOSUCHINSTANCE;
435 return SNMP_ERR_NOERROR;
443 struct tcp_pcb_listen *pcb;
449 idx += snmp_oid_to_ip_port(&row_oid[
idx], row_oid_len -
idx, &local_ip, &local_port);
451 return SNMP_ERR_NOSUCHINSTANCE;
455 pcb = tcp_listen_pcbs.listen_pcbs;
456 while (pcb !=
NULL) {
458 (local_port == pcb->local_port)) {
460 return tcp_ListenerTable_get_cell_value_core(
column,
value);
466 return SNMP_ERR_NOSUCHINSTANCE;
470tcp_ListenerTable_get_next_cell_instance_and_value(
const u32_t *
column,
struct snmp_obj_id *row_oid,
union snmp_variant_value *
value,
u32_t *value_len)
472 struct tcp_pcb_listen *pcb;
473 struct snmp_next_oid_state
state;
475 u32_t result_temp[19];
480 snmp_next_oid_init(&
state, row_oid->id, row_oid->len, result_temp,
LWIP_ARRAYSIZE(result_temp));
483 pcb = tcp_listen_pcbs.listen_pcbs;
484 while (pcb !=
NULL) {
489 idx += snmp_ip_port_to_oid(&pcb->local_ip, pcb->local_port, &test_oid[
idx]);
498 if (
state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
499 snmp_oid_assign(row_oid,
state.next_oid,
state.next_oid_len);
501 return tcp_ListenerTable_get_cell_value_core(
column,
value);
504 return SNMP_ERR_NOSUCHINSTANCE;
508static const struct snmp_scalar_node tcp_RtoAlgorithm = SNMP_SCALAR_CREATE_NODE_READONLY(1, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);
509static const struct snmp_scalar_node tcp_RtoMin = SNMP_SCALAR_CREATE_NODE_READONLY(2, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);
510static const struct snmp_scalar_node tcp_RtoMax = SNMP_SCALAR_CREATE_NODE_READONLY(3, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);
511static const struct snmp_scalar_node tcp_MaxConn = SNMP_SCALAR_CREATE_NODE_READONLY(4, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);
512static const struct snmp_scalar_node tcp_ActiveOpens = SNMP_SCALAR_CREATE_NODE_READONLY(5, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
513static const struct snmp_scalar_node tcp_PassiveOpens = SNMP_SCALAR_CREATE_NODE_READONLY(6, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
514static const struct snmp_scalar_node tcp_AttemptFails = SNMP_SCALAR_CREATE_NODE_READONLY(7, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
515static const struct snmp_scalar_node tcp_EstabResets = SNMP_SCALAR_CREATE_NODE_READONLY(8, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
516static const struct snmp_scalar_node tcp_CurrEstab = SNMP_SCALAR_CREATE_NODE_READONLY(9, SNMP_ASN1_TYPE_GAUGE, tcp_get_value);
517static const struct snmp_scalar_node tcp_InSegs = SNMP_SCALAR_CREATE_NODE_READONLY(10, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
518static const struct snmp_scalar_node tcp_OutSegs = SNMP_SCALAR_CREATE_NODE_READONLY(11, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
519static const struct snmp_scalar_node tcp_RetransSegs = SNMP_SCALAR_CREATE_NODE_READONLY(12, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
520static const struct snmp_scalar_node tcp_InErrs = SNMP_SCALAR_CREATE_NODE_READONLY(14, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
521static const struct snmp_scalar_node tcp_OutRsts = SNMP_SCALAR_CREATE_NODE_READONLY(15, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);
523static const struct snmp_scalar_node tcp_HCInSegs = SNMP_SCALAR_CREATE_NODE_READONLY(17, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value);
524static const struct snmp_scalar_node tcp_HCOutSegs = SNMP_SCALAR_CREATE_NODE_READONLY(18, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value);
528static const struct snmp_table_simple_col_def tcp_ConnTable_columns[] = {
529 { 1, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 },
530 { 2, SNMP_ASN1_TYPE_IPADDR, SNMP_VARIANT_VALUE_TYPE_U32 },
531 { 3, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 },
532 { 4, SNMP_ASN1_TYPE_IPADDR, SNMP_VARIANT_VALUE_TYPE_U32 },
533 { 5, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }
536static const struct snmp_table_simple_node tcp_ConnTable = SNMP_TABLE_CREATE_SIMPLE(13, tcp_ConnTable_columns, tcp_ConnTable_get_cell_value, tcp_ConnTable_get_next_cell_instance_and_value);
539static const struct snmp_table_simple_col_def tcp_ConnectionTable_columns[] = {
541 { 7, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 },
542 { 8, SNMP_ASN1_TYPE_UNSIGNED32, SNMP_VARIANT_VALUE_TYPE_U32 }
545static const struct snmp_table_simple_node tcp_ConnectionTable = SNMP_TABLE_CREATE_SIMPLE(19, tcp_ConnectionTable_columns, tcp_ConnectionTable_get_cell_value, tcp_ConnectionTable_get_next_cell_instance_and_value);
548static const struct snmp_table_simple_col_def tcp_ListenerTable_columns[] = {
550 { 4, SNMP_ASN1_TYPE_UNSIGNED32, SNMP_VARIANT_VALUE_TYPE_U32 }
553static const struct snmp_table_simple_node tcp_ListenerTable = SNMP_TABLE_CREATE_SIMPLE(20, tcp_ListenerTable_columns, tcp_ListenerTable_get_cell_value, tcp_ListenerTable_get_next_cell_instance_and_value);
556CREATE_LWIP_SYNC_NODE( 1, tcp_RtoAlgorithm)
557CREATE_LWIP_SYNC_NODE( 2, tcp_RtoMin)
558CREATE_LWIP_SYNC_NODE( 3, tcp_RtoMax)
559CREATE_LWIP_SYNC_NODE( 4, tcp_MaxConn)
560CREATE_LWIP_SYNC_NODE( 5, tcp_ActiveOpens)
561CREATE_LWIP_SYNC_NODE( 6, tcp_PassiveOpens)
562CREATE_LWIP_SYNC_NODE( 7, tcp_AttemptFails)
563CREATE_LWIP_SYNC_NODE( 8, tcp_EstabResets)
564CREATE_LWIP_SYNC_NODE( 9, tcp_CurrEstab)
565CREATE_LWIP_SYNC_NODE(10, tcp_InSegs)
566CREATE_LWIP_SYNC_NODE(11, tcp_OutSegs)
567CREATE_LWIP_SYNC_NODE(12, tcp_RetransSegs)
569CREATE_LWIP_SYNC_NODE(13, tcp_ConnTable)
571CREATE_LWIP_SYNC_NODE(14, tcp_InErrs)
572CREATE_LWIP_SYNC_NODE(15, tcp_OutRsts)
574CREATE_LWIP_SYNC_NODE(17, tcp_HCInSegs)
575CREATE_LWIP_SYNC_NODE(18, tcp_HCOutSegs)
577CREATE_LWIP_SYNC_NODE(19, tcp_ConnectionTable)
578CREATE_LWIP_SYNC_NODE(20, tcp_ListenerTable)
580static const struct snmp_node *
const tcp_nodes[] = {
581 &SYNC_NODE_NAME(tcp_RtoAlgorithm).node.node,
582 &SYNC_NODE_NAME(tcp_RtoMin).node.node,
583 &SYNC_NODE_NAME(tcp_RtoMax).node.node,
584 &SYNC_NODE_NAME(tcp_MaxConn).node.node,
585 &SYNC_NODE_NAME(tcp_ActiveOpens).node.node,
586 &SYNC_NODE_NAME(tcp_PassiveOpens).node.node,
587 &SYNC_NODE_NAME(tcp_AttemptFails).node.node,
588 &SYNC_NODE_NAME(tcp_EstabResets).node.node,
589 &SYNC_NODE_NAME(tcp_CurrEstab).node.node,
590 &SYNC_NODE_NAME(tcp_InSegs).node.node,
591 &SYNC_NODE_NAME(tcp_OutSegs).node.node,
592 &SYNC_NODE_NAME(tcp_RetransSegs).node.node,
594 &SYNC_NODE_NAME(tcp_ConnTable).node.node,
596 &SYNC_NODE_NAME(tcp_InErrs).node.node,
597 &SYNC_NODE_NAME(tcp_OutRsts).node.node,
598 &SYNC_NODE_NAME(tcp_HCInSegs).node.node,
600 &SYNC_NODE_NAME(tcp_HCOutSegs).node.node,
601 &SYNC_NODE_NAME(tcp_ConnectionTable).node.node,
603 &SYNC_NODE_NAME(tcp_ListenerTable).node.node
606const struct snmp_tree_node snmp_mib2_tcp_root = SNMP_CREATE_TREE_NODE(6, tcp_nodes);
#define LWIP_ARRAYSIZE(x)
static HINSTANCE instance
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define LWIP_UNUSED_ARG(x)
#define IP_IS_V6_VAL(ipaddr)
#define ip_addr_eq(addr1, addr2)
#define IP_IS_V4_VAL(ipaddr)