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