void EtherShield::ES_client_arp_whohas(uint8_t *buf,uint8_t *ip_we_search) { client_arp_whohas(buf, ip_we_search); }
int main(void){ uint16_t plen; uint16_t dat_p; uint8_t cmd; // set the clock speed to "no pre-scaler" (8MHz with internal osc or // full external speed) // set the clock prescaler. First write CLKPCE to enable setting of clock the // next four instructions. CLKPR=(1<<CLKPCE); // change enable CLKPR=0; // "no pre-scaler" uartInit(); uartSetBaudRate(9600); _delay_loop_1(50); // 12ms /* enable PD2/INT0, as input */ DDRD&= ~(1<<DDD2); // test button cbi(DDRD,PIND6); sbi(PORTD,PIND6); // internal pullup resistor on _delay_loop_1(50); // 12ms // read eeprom values unless, the PD6 pin is connected to GND during bootup // PD6 is used to reset to factory default. Note that factory default is // not stored back to eeprom. if (eeprom_read_byte((uint8_t *)0x0) == 19 && ! bit_is_clear(PIND,PIND6)){ // ok magic number matches accept values eeprom_read_block((uint8_t *)myip,(void *)1,sizeof(myip)); eeprom_read_block((uint8_t *)monitoredhost,(void *)6,sizeof(monitoredhost)); pinginterval=eeprom_read_byte((uint8_t *)11); sendping=eeprom_read_byte((uint8_t *)12); eeprom_read_block((char *)password,(void *)13,sizeof(password)); password[7]='\0'; // make sure it is terminated, should not be necessary } /*initialize enc28j60*/ enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(50); // 12ms // LED /* enable PB1, LED as output */ //DDRB|= (1<<DDB1); /* set output to Vcc, LED off */ //LEDOFF; // the transistor on PD7 DDRD|= (1<<DDD7); PORTD &= ~(1<<PIND7);// transistor off /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); _delay_loop_1(50); // 12ms //init the ethernet/ip layer: init_ip_arp_udp_tcp(mymac,myip,MYWWWPORT); timer_init(); _delay_ms(1000); uartFlushReceiveBuffer(); sei(); // interrupt enable while(1){ //uartSendByte('a'); //checkForEthPacket(ethPacket); stop_timer=2; if (checkForEthPacket(ethPacket)) { sendEthPacket(time, sm); time.hr = 99; } stop_timer=0; // wait_data++; // if (wait_data>40) // wait_data=0; //_delay_ms(500); // spontanious messages must not interfer with // web pages if (pagelock==0 && enc28j60hasRxPkt()==0){ if (sendping && havemac==0){ client_arp_whohas(buf,monitoredhost); havemac=2; } if (sendping && havemac==1 && pingnow){ pingnow=0; client_icmp_request(buf,monitoredhost,PINGPATTERN); pingtimer++; // otheweise we would call this function again hoststatus++; if (hoststatus==0xff){ hoststatus=1; // wrap to 1 } } } // get the next new packet: plen = enc28j60PacketReceive(BUFFER_SIZE, buf); /*plen will be unequal to zero if there is a valid * packet (without crc error) */ if(plen==0){ continue; } // arp is broadcast if unknown but a host may also // verify the mac address by sending it to // a unicast address. if(eth_type_is_arp_and_my_ip(buf,plen)){ if (eth_type_is_arp_req(buf)){ make_arp_answer_from_request(buf); } if (eth_type_is_arp_reply(buf)){ if (client_store_gw_mac(buf,monitoredhost)){ havemac=1; } } continue; } // check if ip packets are for us: if(eth_type_is_ip_and_my_ip(buf,plen)==0){ continue; } if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREPLY_V){ if (buf[ICMP_DATA_P]== PINGPATTERN){ if (check_ip_message_is_from(buf,monitoredhost)){ // ping reply is from monitored host and ping was from us hoststatus=0; hostbackafterreboot=1; } } } if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){ if (check_ip_message_is_from(buf,monitoredhost)){ // ping is from monitored host hoststatus=0; hostbackafterreboot=1; } // a ping packet, let's send pong make_echo_reply_from_request(buf,plen); continue; } // tcp port www start, compare only the lower byte if (buf[IP_PROTO_P]==IP_PROTO_TCP_V&&buf[TCP_DST_PORT_H_P]==0&&buf[TCP_DST_PORT_L_P]==MYWWWPORT){ if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V){ make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack continue; } if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){ init_len_info(buf); // init some data structures // we can possibly have no data, just ack: dat_p=get_tcp_data_pointer(); if (dat_p==0){ if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V){ // finack, answer with ack make_tcp_ack_from_any(buf); } // just an ack with no data, wait for next packet continue; } if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ // head, post and other methods: // // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>")); goto SENDTCP; } if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){ plen=print_webpage(buf); goto SENDTCP; } cmd=analyse_get_url((char *)&(buf[dat_p+5])); pagelock=1; // stop automatic actions until webpage is displayed // // error, default, will get overwritte in case // something else is selected: plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Error</h1>")); plen=fill_tcp_data(buf,plen,errmsg); plen=fill_tcp_data_p(buf,plen,PSTR("<br><br><a href=/>->continue</a>\n")); // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html if (cmd==1){ resethost(); plen=print_webpage_confirm(buf); } if (cmd==2){ store_in_eeprom(); plen=print_webpage_confirm(buf); } if (cmd==7){ store_in_eeprom(); plen=print_webpage_confirm(buf); reinitmac=1; } // start and stop of wd, this is not store in eeprom if (cmd==5){ pingtimer=1; // wd on plen=print_webpage_confirm(buf); } if (cmd==4){ pingtimer=0; // wd off plen=print_webpage_confirm(buf); } if (cmd==3){ plen=print_webpage_now(buf); } if (cmd==6){ plen=print_webpage_config(buf); } // testing the temp OK / NOK if (cmd==20){ sm[0].temp= atoi(strbuf); plen=print_webpage_confirm(buf); } if (cmd==21){ sm[1].temp= atoi(strbuf); plen=print_webpage_confirm(buf); } // on / off - slave-modules // ON slave-module-1 if (cmd==34){ sm[0].status = atoi(strbuf); plen=print_webpage_confirmrm1(buf); } // OFF slave-module-1 if (cmd==31){ sm[0].status = atoi(strbuf); plen=print_webpage_confirmrm1(buf); } // ON slave-module-2 if (cmd==32){ sm[1].status = atoi(strbuf); plen=print_webpage_confirmrm2(buf); } // OFF slave-module-2 if (cmd==33){ sm[1].status = atoi(strbuf); plen=print_webpage_confirmrm2(buf); } if (cmd==35){ plen=print_webpage_confirmclk(buf); } if (cmd==36){ plen=print_webpage_confirmclk(buf); } // Room-1 if (cmd==10){ plen=print_webpage_room1(buf); } // ROom-2 if (cmd==11){ plen=print_webpage_room2(buf); } // Clock & date if (cmd==12){ plen=print_webpage_clk(buf); } // SENDTCP: make_tcp_ack_from_any(buf); // send ack for http get make_tcp_ack_with_data(buf,plen); // send data continue; } } // tcp port www end // // udp not implemented } return (0); }