void packet_in(uint8_t *data, uint16_t size) { FullPacket p; /* print_packet(data, size);*/ proto_eth_demangle(&p.eth, data); printf("Eth received\r\n"); if (!MAC_ADDR_EQUAL(p.eth.dst.addr, _bmac) && !MAC_ADDR_EQUAL(p.eth.dst.addr, simple_net_get_mac())) return; if (p.eth.type != PROTO_IP) return; proto_ip_demangle(&p.ip, data + IP_OFFSET); printf("IP received\r\n"); printf("Src: "); print_ip(p.ip.src_addr); printf("\r\nDst: "); print_ip(p.ip.dst_addr); printf("\r\n"); if (p.ip.protocol != PROTO_UDP) return; proto_udp_demangle(&p.udp, data + UDP_OFFSET); printf("UDP received %d %d\r\n", p.udp.src_port, p.udp.dst_port); if (p.udp.dst_port != DHCP_CLIENT_PORT || p.udp.src_port != DHCP_SERVER_PORT) return; printf("Received DHCP packet\r\n"); proto_dhcp_demangle(&p.dhcp, data + DHCP_OFFSET); dhcp_process_packet(&p); }
int main(void){ uint16_t plen; DDRC |= 1U << 3; /* DDRB|= (1<<DDB1); */ /* set output to Vcc, LED off */ PORTC |= 1U << 3; delay_ms(20); PORTC &= ~(1U << 3); delay_ms(20); // set the clock speed to 8MHz // set the clock prescaler. First write CLKPCE to enable setting of clock the // next four instructions. /* CLKPR=(1<<CLKPCE); */ /* CLKPR=0; // 8 MHZ */ /* enable PB0, reset as output */ DDRB|= (1<<DDB0); /* set output to gnd, reset the ethernet chip */ PORTB &= ~(1<<PB0); delay_ms(20); /* set output to Vcc, reset inactive */ PORTB|= (1<<PB0); delay_ms(100); PORTC |= 1U << 3; delay_ms(20); PORTC &= ~(1U << 3); delay_ms(20); // LED /* enable PB1, LED as output */ /*initialize enc28j60*/ enc28j60Init(mymac); /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDA=greed LEDB=yellow // // 0x880 is PHLCON LEDB=on, LEDA=on // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00); enc28j60PhyWrite(PHLCON,0x880); delay_ms(500); // // 0x990 is PHLCON LEDB=off, LEDA=off // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00); enc28j60PhyWrite(PHLCON,0x990); delay_ms(500); // // 0x880 is PHLCON LEDB=on, LEDA=on // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00); enc28j60PhyWrite(PHLCON,0x880); delay_ms(500); // // 0x990 is PHLCON LEDB=off, LEDA=off // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00); enc28j60PhyWrite(PHLCON,0x990); delay_ms(500); // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); delay_ms(100); PORTC &= ~(1<<PC3); delay_ms(1000); dhcp_init(); while(1){ // get the next new packet: if((plen = enc28j60PacketReceive(BUFFER_SIZE, buf))) { if(dhcp_process_packet(buf, plen)) continue; if(arp_process_packet(buf, plen)) continue; if(icmp_process_packet(buf, plen)) { if (PORTC & (1 << PC3)) PORTC &= ~(1 << PC3); else PORTC |= (1 << PC3); continue; } } else { //dhcp_tick_seconds(); } } return (0); }