示例#1
0
文件: main.c 项目: Tikiwinkie/PJE
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);
}
示例#2
0
文件: main.c 项目: rpedde/avr-eth-i2c
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);
}