xref: /minix3/minix/lib/liblwip/dist/doc/NO_SYS_SampleCode.c (revision 5d5fbe79c1b60734f34c69330aec5496644e8651)

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