diff --git a/ports/unix/proj/minimal/Makefile b/ports/unix/proj/minimal/Makefile index e99daf1..4251504 100644 --- a/ports/unix/proj/minimal/Makefile +++ b/ports/unix/proj/minimal/Makefile @@ -59,11 +59,16 @@ CORE4FILES=$(LWIPDIR)/core/ipv4/icmp.c $(LWIPDIR)/core/ipv4/ip.c \ $(LWIPDIR)/core/inet.c $(LWIPDIR)/core/ipv4/ip_addr.c \ $(LWIPDIR)/core/ipv4/ip_frag.c +# SNMPFILES: Extra SNMPv1 agent +SNMPFILES=$(LWIPDIR)/core/snmp/asn1_dec.c $(LWIPDIR)/core/snmp/asn1_enc.c \ + $(LWIPDIR)/core/snmp/mib2.c $(LWIPDIR)/core/snmp/mib_structs.c \ + $(LWIPDIR)/core/snmp/msg_in.c $(LWIPDIR)/core/snmp/msg_out.c + # NETIFFILES: Files implementing various generic network interface functions.' NETIFFILES=$(LWIPDIR)/netif/etharp.c mintapif.c # LWIPFILES: All the above. -LWIPFILES=$(COREFILES) $(CORE4FILES) $(NETIFFILES) +LWIPFILES=$(COREFILES) $(CORE4FILES) $(SNMPFILES) $(NETIFFILES) LWIPFILESW=$(wildcard $(LWIPFILES)) LWIPOBJS=$(notdir $(LWIPFILESW:.c=.o)) diff --git a/ports/unix/proj/minimal/README b/ports/unix/proj/minimal/README index 0edb5f7..8789d47 100644 --- a/ports/unix/proj/minimal/README +++ b/ports/unix/proj/minimal/README @@ -1,3 +1,4 @@ This is an example of a very minimal lwIP project. It runs in a single thread and runs a single example application - an echo server. The -echo application is implemented using the raw API. \ No newline at end of file +echo application is implemented using the raw API. Additionally this +raw API example hosts the SNMPv1 agent for development purposes. diff --git a/ports/unix/proj/minimal/lwipopts.h b/ports/unix/proj/minimal/lwipopts.h index 66de9c5..f6821c0 100644 --- a/ports/unix/proj/minimal/lwipopts.h +++ b/ports/unix/proj/minimal/lwipopts.h @@ -149,6 +149,17 @@ a lot of data that needs to be copied, this should be set high. */ (recommended). */ #define DHCP_DOES_ARP_CHECK 1 +/* ---------- SNMP options ---------- */ +/** @todo SNMP isn't functional yet. + @note UDP must be available for SNMP transport */ +#ifndef LWIP_SNMP +#define LWIP_SNMP 1 +#endif + +#ifndef SNMP_PRIVATE_MIB +#define SNMP_PRIVATE_MIB 0 +#endif + /* ---------- UDP options ---------- */ #define LWIP_UDP 1 #define UDP_TTL 255 diff --git a/ports/unix/proj/minimal/main.c b/ports/unix/proj/minimal/main.c index 8486e94..97d1cb7 100644 --- a/ports/unix/proj/minimal/main.c +++ b/ports/unix/proj/minimal/main.c @@ -41,6 +41,7 @@ #include "lwip/ip.h" #include "lwip/ip_frag.h" #include "lwip/udp.h" +#include "lwip/snmp_msg.h" #include "lwip/tcp.h" #include "mintapif.h" @@ -71,6 +72,7 @@ main(int argc, char **argv) netif_init(); ip_init(); udp_init(); + snmp_init(); tcp_init(); printf("TCP/IP initialized.\n"); diff --git a/ports/unix/proj/minimal/mintapif.c b/ports/unix/proj/minimal/mintapif.c index 7e0e733..e7071d1 100644 --- a/ports/unix/proj/minimal/mintapif.c +++ b/ports/unix/proj/minimal/mintapif.c @@ -60,6 +60,7 @@ #endif #include "lwip/stats.h" +#include "lwip/snmp.h" #include "lwip/mem.h" #include "netif/etharp.h" @@ -149,6 +150,7 @@ low_level_output(struct netif *netif, struct pbuf *p) struct pbuf *q; char buf[1514]; char *bufptr; + int written; mintapif = netif->state; @@ -166,9 +168,14 @@ low_level_output(struct netif *netif, struct pbuf *p) } /* signal that packet should be sent(); */ - if (write(mintapif->fd, buf, p->tot_len) == -1) { + written = write(mintapif->fd, buf, p->tot_len); + if (written == -1) { + snmp_inc_ifoutdiscards(netif); perror("tapif: write"); } + else { + snmp_add_ifoutoctets(netif, written); + } return ERR_OK; } /*-----------------------------------------------------------------------------------*/ @@ -181,22 +188,25 @@ low_level_output(struct netif *netif, struct pbuf *p) */ /*-----------------------------------------------------------------------------------*/ static struct pbuf * -low_level_input(struct mintapif *mintapif) +low_level_input(struct netif *netif) { struct pbuf *p, *q; u16_t len; char buf[1514]; char *bufptr; + struct mintapif *mintapif; + + mintapif = netif->state; /* Obtain the size of the packet and put it into the "len" variable. */ len = read(mintapif->fd, buf, sizeof(buf)); + snmp_add_ifinoctets(netif,len); /* if (((double)rand()/(double)RAND_MAX) < 0.1) { printf("drop\n"); return NULL; }*/ - /* We allocate a pbuf chain of pbufs from the pool. */ p = pbuf_alloc(PBUF_LINK, len, PBUF_POOL); @@ -216,6 +226,7 @@ low_level_input(struct mintapif *mintapif) /* acknowledge that packet has been read(); */ } else { /* drop packet(); */ + snmp_inc_ifindiscards(netif); printf("Could not allocate pbufs\n"); } @@ -258,7 +269,7 @@ mintapif_input(struct netif *netif) mintapif = netif->state; - p = low_level_input(mintapif); + p = low_level_input(netif); if (p != NULL) { @@ -304,7 +315,29 @@ mintapif_init(struct netif *netif) struct mintapif *mintapif; mintapif = mem_malloc(sizeof(struct mintapif)); + if (mintapif == NULL) + { + LWIP_DEBUGF(NETIF_DEBUG, ("cs8900_init: out of memory for mintapif\n")); + return ERR_MEM; + } netif->state = mintapif; +#if LWIP_SNMP + /* ifType is other(1), there doesn't seem + to be a proper type for the tunnel if */ + netif->link_type = 1; + /* @todo get this from struct tunif? */ + netif->link_speed = 0; + netif->ts = 0; + netif->ifinoctets = 0; + netif->ifinucastpkts = 0; + netif->ifinnucastpkts = 0; + netif->ifindiscards = 0; + netif->ifoutoctets = 0; + netif->ifoutucastpkts = 0; + netif->ifoutnucastpkts = 0; + netif->ifoutdiscards = 0; +#endif + netif->hwaddr_len = 6; netif->name[0] = IFNAME0; netif->name[1] = IFNAME1; diff --git a/ports/unix/proj/minimal/timer.c b/ports/unix/proj/minimal/timer.c index e34ee7d..353e53b 100644 --- a/ports/unix/proj/minimal/timer.c +++ b/ports/unix/proj/minimal/timer.c @@ -39,6 +39,7 @@ #include #include #include "timer.h" +#include "lwip/snmp.h" static struct itimerval tmr; @@ -136,6 +137,8 @@ sigalarm_handler(int sig) unsigned char i; struct itmr *tp; + snmp_inc_sysuptime(); + tp = &timers[TIMER_NUM-1]; for(i = TIMER_NUM; i > 0; i--) { diff --git a/ports/unix/proj/unixsim/Makefile b/ports/unix/proj/unixsim/Makefile index ddf5aff..b823925 100644 --- a/ports/unix/proj/unixsim/Makefile +++ b/ports/unix/proj/unixsim/Makefile @@ -57,6 +57,10 @@ COREFILES=$(LWIPDIR)/core/mem.c $(LWIPDIR)/core/memp.c $(LWIPDIR)/core/netif.c \ $(LWIPDIR)/core/tcp_out.c $(LWIPDIR)/core/udp.c $(LWIPDIR)/core/dhcp.c CORE4FILES=$(wildcard $(LWIPDIR)/core/ipv4/*.c) $(LWIPDIR)/core/inet.c +# SNMPFILES: Extra SNMPv1 agent +SNMPFILES=$(LWIPDIR)/core/snmp/asn1_dec.c $(LWIPDIR)/core/snmp/asn1_enc.c \ + $(LWIPDIR)/core/snmp/mib2.c $(LWIPDIR)/core/snmp/mib_structs.c \ + $(LWIPDIR)/core/snmp/msg_in.c $(LWIPDIR)/core/snmp/msg_out.c # APIFILES: The files which implement the sequential and socket APIs. APIFILES=$(LWIPDIR)/api/api_lib.c $(LWIPDIR)/api/api_msg.c $(LWIPDIR)/api/tcpip.c \ @@ -84,7 +88,7 @@ APPFILES=apps/fs.c apps/httpd.c \ apps/shell.c # LWIPFILES: All the above. -LWIPFILES=$(COREFILES) $(CORE4FILES) $(APIFILES) $(NETIFFILES) $(ARCHFILES) +LWIPFILES=$(COREFILES) $(CORE4FILES) $(SNMPFILES) $(APIFILES) $(NETIFFILES) $(ARCHFILES) LWIPFILESW=$(wildcard $(LWIPFILES)) LWIPOBJS=$(notdir $(LWIPFILESW:.c=.o)) diff --git a/ports/unix/proj/unixsim/lwipopts.h b/ports/unix/proj/unixsim/lwipopts.h index c299fe9..9709295 100644 --- a/ports/unix/proj/unixsim/lwipopts.h +++ b/ports/unix/proj/unixsim/lwipopts.h @@ -195,6 +195,17 @@ a lot of data that needs to be copied, this should be set high. */ (recommended). */ #define DHCP_DOES_ARP_CHECK 1 +/* ---------- SNMP options ---------- */ +/** @todo SNMP is experimental for now + @note UDP must be available for SNMP transport */ +#ifndef LWIP_SNMP +#define LWIP_SNMP 0 +#endif + +#ifndef SNMP_PRIVATE_MIB +#define SNMP_PRIVATE_MIB 0 +#endif + /* ---------- UDP options ---------- */ #define LWIP_UDP 1 #define UDP_TTL 255