Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ambrop72/badvpn.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lwip/doc/NO_SYS_SampleCode.c')
-rw-r--r--lwip/doc/NO_SYS_SampleCode.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/lwip/doc/NO_SYS_SampleCode.c b/lwip/doc/NO_SYS_SampleCode.c
new file mode 100644
index 0000000..f0af660
--- /dev/null
+++ b/lwip/doc/NO_SYS_SampleCode.c
@@ -0,0 +1,122 @@
+void
+eth_mac_irq()
+{
+ /* Service MAC IRQ here */
+
+ /* Allocate pbuf from pool (avoid using heap in interrupts) */
+ struct pbuf* p = pbuf_alloc(PBUF_RAW, eth_data_count, PBUF_POOL);
+
+ if(p != NULL) {
+ /* Copy ethernet frame into pbuf */
+ pbuf_take(p, eth_data, eth_data_count);
+
+ /* Put in a queue which is processed in main loop */
+ if(!queue_try_put(&queue, p)) {
+ /* queue is full -> packet loss */
+ pbuf_free(p);
+ }
+ }
+}
+
+static err_t
+netif_output(struct netif *netif, struct pbuf *p)
+{
+ LINK_STATS_INC(link.xmit);
+
+ /* Update SNMP stats (only if you use SNMP) */
+ MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p->tot_len);
+ int unicast = ((p->payload[0] & 0x01) == 0);
+ if (unicast) {
+ MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
+ } else {
+ MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);
+ }
+
+ lock_interrupts();
+ pbuf_copy_partial(p, mac_send_buffer, p->tot_len, 0);
+ /* Start MAC transmit here */
+ unlock_interrupts();
+
+ return ERR_OK;
+}
+
+static void
+netif_status_callback(struct netif *netif)
+{
+ printf("netif status changed %s\n", ip4addr_ntoa(netif_ip4_addr(netif)));
+}
+
+static err_t
+netif_init(struct netif *netif)
+{
+ netif->linkoutput = netif_output;
+ netif->output = etharp_output;
+ netif->output_ip6 = ethip6_output;
+ netif->mtu = ETHERNET_MTU;
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;
+ MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, 100000000);
+
+ SMEMCPY(netif->hwaddr, your_mac_address_goes_here, sizeof(netif->hwaddr));
+ netif->hwaddr_len = sizeof(netif->hwaddr);
+
+ return ERR_OK;
+}
+
+void
+main(void)
+{
+ struct netif netif;
+
+ lwip_init();
+
+ netif_add(&netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY, NULL, netif_init, netif_input);
+ netif.name[0] = 'e';
+ netif.name[1] = '0';
+ netif_create_ip6_linklocal_address(&netif, 1);
+ netif.ip6_autoconfig_enabled = 1;
+ netif_set_status_callback(&netif, netif_status_callback);
+ netif_set_default(&netif);
+ netif_set_up(&netif);
+
+ /* Start DHCP and HTTPD */
+ dhcp_start(&netif );
+ httpd_init();
+
+ while(1) {
+ /* Check link state, e.g. via MDIO communication with PHY */
+ if(link_state_changed()) {
+ if(link_is_up()) {
+ netif_set_link_up(&netif);
+ } else {
+ netif_set_link_down(&netif);
+ }
+ }
+
+ /* Check for received frames, feed them to lwIP */
+ lock_interrupts();
+ struct pbuf* p = queue_try_get(&queue);
+ unlock_interrupts();
+
+ if(p != NULL) {
+ LINK_STATS_INC(link.recv);
+
+ /* Update SNMP stats (only if you use SNMP) */
+ MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);
+ int unicast = ((p->payload[0] & 0x01) == 0);
+ if (unicast) {
+ MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
+ } else {
+ MIB2_STATS_NETIF_INC(netif, ifinnucastpkts);
+ }
+
+ if(netif.input(p, &netif) != ERR_OK) {
+ pbuf_free(p);
+ }
+ }
+
+ /* Cyclic lwIP timers check */
+ sys_check_timeouts();
+
+ /* your application goes here */
+ }
+}