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