xref: /nrf52832-nimble/rt-thread/components/net/lwip-2.1.0/doc/NO_SYS_SampleCode.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero void
eth_mac_irq()2*10465441SEvalZero eth_mac_irq()
3*10465441SEvalZero {
4*10465441SEvalZero   /* Service MAC IRQ here */
5*10465441SEvalZero 
6*10465441SEvalZero   /* Allocate pbuf from pool (avoid using heap in interrupts) */
7*10465441SEvalZero   struct pbuf* p = pbuf_alloc(PBUF_RAW, eth_data_count, PBUF_POOL);
8*10465441SEvalZero 
9*10465441SEvalZero   if(p != NULL) {
10*10465441SEvalZero     /* Copy ethernet frame into pbuf */
11*10465441SEvalZero     pbuf_take(p, eth_data, eth_data_count);
12*10465441SEvalZero 
13*10465441SEvalZero     /* Put in a queue which is processed in main loop */
14*10465441SEvalZero     if(!queue_try_put(&queue, p)) {
15*10465441SEvalZero       /* queue is full -> packet loss */
16*10465441SEvalZero       pbuf_free(p);
17*10465441SEvalZero     }
18*10465441SEvalZero   }
19*10465441SEvalZero }
20*10465441SEvalZero 
21*10465441SEvalZero static err_t
netif_output(struct netif * netif,struct pbuf * p)22*10465441SEvalZero netif_output(struct netif *netif, struct pbuf *p)
23*10465441SEvalZero {
24*10465441SEvalZero   LINK_STATS_INC(link.xmit);
25*10465441SEvalZero 
26*10465441SEvalZero   /* Update SNMP stats (only if you use SNMP) */
27*10465441SEvalZero   MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p->tot_len);
28*10465441SEvalZero   int unicast = ((p->payload[0] & 0x01) == 0);
29*10465441SEvalZero   if (unicast) {
30*10465441SEvalZero     MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
31*10465441SEvalZero   } else {
32*10465441SEvalZero     MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);
33*10465441SEvalZero   }
34*10465441SEvalZero 
35*10465441SEvalZero   lock_interrupts();
36*10465441SEvalZero   pbuf_copy_partial(p, mac_send_buffer, p->tot_len, 0);
37*10465441SEvalZero   /* Start MAC transmit here */
38*10465441SEvalZero   unlock_interrupts();
39*10465441SEvalZero 
40*10465441SEvalZero   return ERR_OK;
41*10465441SEvalZero }
42*10465441SEvalZero 
43*10465441SEvalZero static void
netif_status_callback(struct netif * netif)44*10465441SEvalZero netif_status_callback(struct netif *netif)
45*10465441SEvalZero {
46*10465441SEvalZero   printf("netif status changed %s\n", ip4addr_ntoa(netif_ip4_addr(netif)));
47*10465441SEvalZero }
48*10465441SEvalZero 
49*10465441SEvalZero static err_t
netif_init(struct netif * netif)50*10465441SEvalZero netif_init(struct netif *netif)
51*10465441SEvalZero {
52*10465441SEvalZero   netif->linkoutput = netif_output;
53*10465441SEvalZero   netif->output     = etharp_output;
54*10465441SEvalZero   netif->output_ip6 = ethip6_output;
55*10465441SEvalZero   netif->mtu        = ETHERNET_MTU;
56*10465441SEvalZero   netif->flags      = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;
57*10465441SEvalZero   MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, 100000000);
58*10465441SEvalZero 
59*10465441SEvalZero   SMEMCPY(netif->hwaddr, your_mac_address_goes_here, ETH_HWADDR_LEN);
60*10465441SEvalZero   netif->hwaddr_len = ETH_HWADDR_LEN;
61*10465441SEvalZero 
62*10465441SEvalZero   return ERR_OK;
63*10465441SEvalZero }
64*10465441SEvalZero 
65*10465441SEvalZero void
main(void)66*10465441SEvalZero main(void)
67*10465441SEvalZero {
68*10465441SEvalZero   struct netif netif;
69*10465441SEvalZero 
70*10465441SEvalZero   lwip_init();
71*10465441SEvalZero 
72*10465441SEvalZero   netif_add(&netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY, NULL, netif_init, netif_input);
73*10465441SEvalZero   netif.name[0] = 'e';
74*10465441SEvalZero   netif.name[1] = '0';
75*10465441SEvalZero   netif_create_ip6_linklocal_address(&netif, 1);
76*10465441SEvalZero   netif.ip6_autoconfig_enabled = 1;
77*10465441SEvalZero   netif_set_status_callback(&netif, netif_status_callback);
78*10465441SEvalZero   netif_set_default(&netif);
79*10465441SEvalZero   netif_set_up(&netif);
80*10465441SEvalZero 
81*10465441SEvalZero   /* Start DHCP and HTTPD */
82*10465441SEvalZero   dhcp_start(&netif );
83*10465441SEvalZero   httpd_init();
84*10465441SEvalZero 
85*10465441SEvalZero   while(1) {
86*10465441SEvalZero     /* Check link state, e.g. via MDIO communication with PHY */
87*10465441SEvalZero     if(link_state_changed()) {
88*10465441SEvalZero       if(link_is_up()) {
89*10465441SEvalZero         netif_set_link_up(&netif);
90*10465441SEvalZero       } else {
91*10465441SEvalZero         netif_set_link_down(&netif);
92*10465441SEvalZero       }
93*10465441SEvalZero     }
94*10465441SEvalZero 
95*10465441SEvalZero     /* Check for received frames, feed them to lwIP */
96*10465441SEvalZero     lock_interrupts();
97*10465441SEvalZero     struct pbuf* p = queue_try_get(&queue);
98*10465441SEvalZero     unlock_interrupts();
99*10465441SEvalZero 
100*10465441SEvalZero     if(p != NULL) {
101*10465441SEvalZero       LINK_STATS_INC(link.recv);
102*10465441SEvalZero 
103*10465441SEvalZero       /* Update SNMP stats (only if you use SNMP) */
104*10465441SEvalZero       MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);
105*10465441SEvalZero       int unicast = ((p->payload[0] & 0x01) == 0);
106*10465441SEvalZero       if (unicast) {
107*10465441SEvalZero         MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
108*10465441SEvalZero       } else {
109*10465441SEvalZero         MIB2_STATS_NETIF_INC(netif, ifinnucastpkts);
110*10465441SEvalZero       }
111*10465441SEvalZero 
112*10465441SEvalZero       if(netif.input(p, &netif) != ERR_OK) {
113*10465441SEvalZero         pbuf_free(p);
114*10465441SEvalZero       }
115*10465441SEvalZero     }
116*10465441SEvalZero 
117*10465441SEvalZero     /* Cyclic lwIP timers check */
118*10465441SEvalZero     sys_check_timeouts();
119*10465441SEvalZero 
120*10465441SEvalZero     /* your application goes here */
121*10465441SEvalZero   }
122*10465441SEvalZero }
123