void client_ntp_request(uint8_t *buf,uint8_t *ntpip,uint8_t srcport,uint8_t *dstmac) { uint8_t i=0; uint16_t ck; // while(i<6){ buf[ETH_DST_MAC +i]=dstmac[i]; // gw mac in local lan or host mac buf[ETH_SRC_MAC +i]=macaddr[i]; i++; } buf[ETH_TYPE_H_P] = ETHTYPE_IP_H_V; buf[ETH_TYPE_L_P] = ETHTYPE_IP_L_V; fill_buf_p(&buf[IP_P],9,iphdr); buf[IP_ID_L_P]=ipid; ipid++; buf[IP_TOTLEN_L_P]=0x4c; buf[IP_PROTO_P]=IP_PROTO_UDP_V; i=0; while(i<4){ buf[IP_DST_P+i]=ntpip[i]; buf[IP_SRC_P+i]=ipaddr[i]; i++; } fill_ip_hdr_checksum(buf); buf[UDP_DST_PORT_H_P]=0; buf[UDP_DST_PORT_L_P]=0x7b; // ntp=123 buf[UDP_SRC_PORT_H_P]=10; buf[UDP_SRC_PORT_L_P]=srcport; // lower 8 bit of src port buf[UDP_LEN_H_P]=0; buf[UDP_LEN_L_P]=56; // fixed len // zero the checksum buf[UDP_CHECKSUM_H_P]=0; buf[UDP_CHECKSUM_L_P]=0; // copy the data: i=0; // most fields are zero, here we zero everything and fill later while(i<48){ buf[UDP_DATA_P+i]=0; i++; } fill_buf_p(&buf[UDP_DATA_P],10,ntpreqhdr); // ck=checksum(&buf[IP_SRC_P], 16 + 48,1); buf[UDP_CHECKSUM_H_P]=ck>>8; buf[UDP_CHECKSUM_L_P]=ck& 0xff; enc28j60PacketSend(90,buf); }
void send_udp_prepare(uint8_t *buf,uint16_t sport, const uint8_t *dip, uint16_t dport,const uint8_t *dstmac) { uint8_t i=0; // while(i<6){ buf[ETH_DST_MAC +i]=dstmac[i]; // gw mac in local lan or host mac //fc-75-16-4e-59-43 buf[ETH_SRC_MAC +i]=macaddr[i]; i++; } buf[ETH_TYPE_H_P] = ETHTYPE_IP_H_V; buf[ETH_TYPE_L_P] = ETHTYPE_IP_L_V; fill_buf_p(&buf[IP_P],9,iphdr); buf[IP_ID_L_P]=ipid; ipid++; // total length field in the IP header must be set: buf[IP_TOTLEN_H_P]=0; // done in transmit: buf[IP_TOTLEN_L_P]=IP_HEADER_LEN+UDP_HEADER_LEN+datalen; buf[IP_PROTO_P]=IP_PROTO_UDP_V; i=0; while(i<4){ buf[IP_DST_P+i]=dip[i]; buf[IP_SRC_P+i]=ipaddr[i]; i++; } // done in transmit: fill_ip_hdr_checksum(buf); buf[UDP_DST_PORT_H_P]=(dport>>8); buf[UDP_DST_PORT_L_P]=0xff&dport; buf[UDP_SRC_PORT_H_P]=(sport>>8); buf[UDP_SRC_PORT_L_P]=sport&0xff; buf[UDP_LEN_H_P]=0; // done in transmit: buf[UDP_LEN_L_P]=UDP_HEADER_LEN+datalen; // zero the checksum buf[UDP_CHECKSUM_H_P]=0; buf[UDP_CHECKSUM_L_P]=0; // copy the data: // now starting with the first byte at buf[UDP_DATA_P] // }
void webif_data(uint8_t id, eth_frame_t *frame, uint16_t len) { ip_packet_t *ip = (void*)(frame->data); tcp_packet_t *tcp = (void*)(ip->data); char *req = (void*)tcp_get_data(tcp); char *buf = (void*)(tcp->data), *buf_ptr = buf; char *url, *p, *params, *name, *value; if(!len) return; if( (memcmp_P(req, PSTR("GET "), 4) == 0) && ((p = strchr(req + 4, ' ')) != 0) ) { url = req + 4; *p = 0; if((params = strchr(url, '?'))) *(params++) = 0; if(strcmp_P(url, PSTR("/")) == 0) { if(params==NULL) { send_Uart_str(" No params!"); send_Uart(13); }else { send_Uart_str(" With params!"); send_Uart(13); } while(params) { if((p = strchr(params, '&'))) *(p++) = 0; name = params; if((value = strchr(name, '='))) *(value++) = 0; if( (strcmp_P(name, PSTR("led")) == 0 ) && value ) { if(strcmp_P(value, PSTR("on")) == 0) led_on() else if(strcmp_P(value, PSTR("off")) == 0) led_off() } else if( (strcmp_P(name, PSTR("lang")) == 0) && value ) { if(strcmp_P(value, PSTR("en")) == 0) lang_ru = 0; else if(strcmp_P(value, PSTR("ru")) == 0) lang_ru = 1; } params = p; } fill_buf_p(&buf_ptr, webif_200_header); fill_buf_p(&buf_ptr, PSTR("<pre>")); if(!lang_ru) { fill_buf_p(&buf_ptr, PSTR("<p align='right'>[<b>EN</b> | " "<a href='/?lang=ru'>RU</a>]</p>")); } else { fill_buf_p(&buf_ptr, PSTR("<p align='right'>[<a href='/?lang=en'>EN</a> | " "<b>RU</b>]</p>")); } if((!led_state)&&(!lang_ru)) fill_buf_p(&buf_ptr, PSTR("Led is OFF. Turn <a href='/?led=on'>on</a>.")); else if(led_state &&(!lang_ru)) fill_buf_p(&buf_ptr, PSTR("Led is ON. Turn <a href='/?led=off'>off</a>.")); else if((!led_state)&&(lang_ru)) fill_buf_p(&buf_ptr, PSTR("Светодиод выключен. <a href='/?led=on'>Включить</a>.")); else if(led_state &&(lang_ru)) fill_buf_p(&buf_ptr, PSTR("Светодиод включен. <a href='/?led=off'>Выключить</a>.")); fill_buf_p(&buf_ptr, PSTR("</pre>")); }
void EtherShield::ES_fill_buf_p(uint8_t *buf,uint16_t len, const char *progmem_s) { fill_buf_p(buf, len, progmem_s); }