void loop(){ plen = es.ES_enc28j60PacketReceive (BUFFER_SIZE, buf); /*plen will be unequal to zero if there is a valid packet (without crc error) */ if (plen != 0){ if (es.ES_eth_type_is_arp_and_my_ip (buf,plen)) { es.ES_make_arp_answer_from_request (buf); } // check if ip packets (icmp or udp) are for us: if (es.ES_eth_type_is_ip_and_my_ip (buf,plen)!=0) { if (buf[IP_PROTO_P] == IP_PROTO_ICMP_V && buf[ICMP_TYPE_P] == ICMP_TYPE_ECHOREQUEST_V) { // a ping packet, let's send pong es.ES_make_echo_reply_from_request (buf, plen); } } } }
char* ETHER_28J60::serviceRequest() { uint16_t dat_p; int8_t cmd; plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf); /*plen will ne unequal to zero if there is a valid packet (without crc error) */ if(plen!=0) { // arp is broadcast if unknown but a host may also verify the mac address by sending it to a unicast address. if (es.ES_eth_type_is_arp_and_my_ip(buf, plen)) { es.ES_make_arp_answer_from_request(buf); return 0; } // check if ip packets are for us: if (es.ES_eth_type_is_ip_and_my_ip(buf, plen) == 0) { return 0; } if (buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V) { es.ES_make_echo_reply_from_request(buf, plen); return 0; } // 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] == _port) { if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V) { es.ES_make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack return 0; } if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V) { es.ES_init_len_info(buf); // init some data structures dat_p=es.ES_get_tcp_data_pointer(); if (dat_p==0) { // we can possibly have no data, just ack: if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V) { es.ES_make_tcp_ack_from_any(buf); } return 0; } 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=es.ES_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>")); plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<h1>A</h1>")); respond(); } if (strncmp("/",(char *)&(buf[dat_p+4]),1)==0) // was "/ " and 2 { // Copy the request action before we overwrite it with the response int i = 0; while (buf[dat_p+5+i] != ' ' && i < STR_BUFFER_SIZE) { strbuf[i] = buf[dat_p+5+i]; i++; } strbuf[i] = '\0'; plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n")); return (char*)strbuf; } } } } }