📄 ip_arp_udp_tcp.i
字号:
unsigned char enc28j60ReadOp(unsigned char op, unsigned char address);
void enc28j60WriteOp(unsigned char op, unsigned char address, unsigned char data);
void enc28j60ReadBuffer(unsigned int len, unsigned char* data);
void enc28j60WriteBuffer(unsigned int len, unsigned char* data);
void enc28j60SetBank(unsigned char address);
unsigned char enc28j60Read(unsigned char address);
void enc28j60Write(unsigned char address, unsigned char data);
void enc28j60PhyWrite(unsigned char address, unsigned int data);
void enc28j60clkout(unsigned char clk);
void enc28j60Init(unsigned char* macaddr);
void enc28j60PacketSend(unsigned int len, unsigned char* packet);
unsigned int enc28j60PacketReceive(unsigned int maxlen, unsigned char* packet);
unsigned char enc28j60getrev(void);
#pragma used+
sfrb PINF=0;
sfrb PINE=1;
sfrb DDRE=2;
sfrb PORTE=3;
sfrb ADCL=4;
sfrb ADCH=5;
sfrw ADCW=4;
sfrb ADCSRA=6;
sfrb ADMUX=7;
sfrb ACSR=8;
sfrb UBRR0L=9;
sfrb UCSR0B=0xa;
sfrb UCSR0A=0xb;
sfrb UDR0=0xc;
sfrb SPCR=0xd;
sfrb SPSR=0xe;
sfrb SPDR=0xf;
sfrb PIND=0x10;
sfrb DDRD=0x11;
sfrb PORTD=0x12;
sfrb PINC=0x13;
sfrb DDRC=0x14;
sfrb PORTC=0x15;
sfrb PINB=0x16;
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb PINA=0x19;
sfrb DDRA=0x1a;
sfrb PORTA=0x1b;
sfrb EECR=0x1c;
sfrb EEDR=0x1d;
sfrb EEARL=0x1e;
sfrb EEARH=0x1f;
sfrw EEAR=0x1e;
sfrb SFIOR=0x20;
sfrb WDTCR=0x21;
sfrb OCDR=0x22;
sfrb OCR2=0x23;
sfrb TCNT2=0x24;
sfrb TCCR2=0x25;
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrw ICR1=0x26;
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28;
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a;
sfrb TCNT1L=0x2c;
sfrb TCNT1H=0x2d;
sfrw TCNT1=0x2c;
sfrb TCCR1B=0x2e;
sfrb TCCR1A=0x2f;
sfrb ASSR=0x30;
sfrb OCR0=0x31;
sfrb TCNT0=0x32;
sfrb TCCR0=0x33;
sfrb MCUCSR=0x34;
sfrb MCUCR=0x35;
sfrb TIFR=0x36;
sfrb TIMSK=0x37;
sfrb EIFR=0x38;
sfrb EIMSK=0x39;
sfrb EICRB=0x3a;
sfrb XDIV=0x3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-
#asm
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x20
.EQU __sm_mask=0x1C
.EQU __sm_powerdown=0x10
.EQU __sm_powersave=0x18
.EQU __sm_standby=0x14
.EQU __sm_ext_standby=0x1C
.EQU __sm_adc_noise_red=0x08
.SET power_ctrl_reg=mcucr
#endif
#endasm
#pragma used+
char getchar1(void)
{
char status,data;
while (1)
{
while (((status=(*(unsigned char *) 0x9b)) & (1<<7))==0);
data=(*(unsigned char *) 0x9c);
if ((status & ((1<<4) | (1<<2) | (1<<3)))==0)
return data;
};
}
#pragma used-
#pragma used+
void putchar1(char c)
{
while (((*(unsigned char *) 0x9b) & (1<<5))==0);
(*(unsigned char *) 0x9c)=c;
}
#pragma used-
void convert(unsigned char in)
{
unsigned char a0,a1,a2;
a0=in%10;
a1=(in/10)%10;
a2=in/100;
putchar1(a2+'0');
putchar1(a1+'0');
putchar1(a0+'0');
}
unsigned char wwwport=80;
unsigned char macaddr[6];
unsigned char ipaddr[4];
unsigned int info_hdr_len=0;
unsigned int info_data_len=0;
unsigned char seqnum=0xa;
unsigned char checksum(unsigned char *buf, unsigned int len,unsigned char type)
{
unsigned long int sum = 0;
if(type==1){
sum+=0x11;
sum+=len-8;
}
if(type==2){
sum+=0x06;
sum+=len-8;
}
while(len >1)
{
sum +=( 0xFFFF & ((*buf)<<8|*(buf+1)) );
buf+=2;
len-=2;
}
if (len){
sum += (0xFF & *buf)<<8;
}
while (sum>>16){
sum = (sum & 0xFFFF)+(sum >> 16);
}
return( (unsigned char) sum ^ 0xFFFF);
}
void init_ip_arp_udp_tcp(unsigned char *mymac,unsigned char *myip,unsigned char wwwp)
{
unsigned char i=0;
wwwport=wwwp;
while(i<4){
ipaddr[i]=myip[i];
i++;
}
i=0;
while(i<6){
macaddr[i]=mymac[i];
i++;
}
}
unsigned char eth_type_is_arp_and_my_ip(unsigned char* buf,unsigned int len)
{
unsigned char i=0;
if (len<41)
{
return(0);
}
if( (buf[12] != 0x08) || (buf[13] != 0x06) )
{
DDRD.6=1;PORTD.6=~PORTD.6;
return(0);
}
while(i<4)
{
if(buf[0x26+i] != ipaddr[i])
{
return(0);
}
i++;
}
return(1);
}
unsigned char eth_type_is_ip_and_my_ip(unsigned char* buf,unsigned char len)
{
unsigned char i=0;
putchar1(' ');
putchar1((len/100)%10+'0');
putchar1((len/10)%10+'0');
putchar1(len%10+'0');
putchar1(' ');
for(i=0;i<len;i++)
{
convert(i);
putchar1(' ');
convert( *(buf+i) );
putchar1(' ');
putchar1(' ');
}
putchar1('\n');
putchar1('\r');
i=0;
if (len<42)
{
return(0);
}
if(buf[12]!=0x08 || buf[13]!=0x00)
{
DDRD.4=1;PORTD.4=~PORTD.4;
return(0);
}
if (buf[0xe]!=0x45)
{
return(0);
}
while(i<4)
{
if(buf[0x1e+i]!=ipaddr[i]){
return(0);
}
i++;
}
return(1);
}
void make_eth(unsigned char *buf)
{
unsigned char i=0;
while(i<6){
buf[0 +i]=buf[6 +i];
buf[6 +i]=macaddr[i];
i++;
}
}
void make_eth_ip_new(unsigned char *buf, unsigned char* dst_mac)
{
unsigned char i=0;
while(i<6){
buf[0 +i]=dst_mac[i];
buf[6 +i]=macaddr[i];
i++;
}
buf[ 12 ] = 0x08;
buf[ 13 ] = 0x00;
}
void fill_ip_hdr_checksum(unsigned char *buf)
{
unsigned char ck;
buf[0x18 ]=0;
buf[0x18 +1]=0;
buf[0x14 ]=0x40;
buf[0x14 +1]=0;
buf[0x16]=64;
ck=checksum(&buf[0x0E], 20,0);
buf[0x18 ]=ck>>8;
buf[0x18 +1]=ck& 0xff;
}
static unsigned char ip_identifier = 1;
void make_ip_tcp_new(unsigned char *buf, unsigned char len,unsigned char *dst_ip)
{
unsigned char i=0;
buf[ 0x0E ] = 0x40 | 0x05;
buf[ 0x0F ] = 0x00;
buf[ 0x10 ] = (len >>8)& 0xff;
buf[ 0x11 ] = len & 0xff;
buf[ 0x12 ] = (ip_identifier >>8) & 0xff;
buf[ 0x13 ] = ip_identifier & 0xff;
ip_identifier++;
buf[ 0x14 ] = 0x00;
buf[ 0x15 ] = 0x00;
buf[ 0x16 ] = 128;
buf[ 0x17 ] = 0x06;
while(i<4){
buf[0x1e+i]=dst_ip[i];
buf[0x1a+i]=ipaddr[i];
i++;
}
fill_ip_hdr_checksum(buf);
}
void make_ip(unsigned char *buf)
{
unsigned char i=0;
while(i<4){
buf[0x1e+i]=buf[0x1a+i];
buf[0x1a+i]=ipaddr[i];
i++;
}
fill_ip_hdr_checksum(buf);
}
void make_tcphead(unsigned char *buf,unsigned char rel_ack_num,unsigned char mss,unsigned char cp_seq)
{
unsigned char i=0;
unsigned char tseq;
while(i<2){
buf[0x24+i]=buf[0x22+i];
buf[0x22+i]=0;
i++;
}
buf[0x23]=wwwport;
i=4;
while(i>0){
rel_ack_num=buf[0x26+i-1]+rel_ack_num;
tseq=buf[0x2A+i-1];
buf[0x2A+i-1]=0xff&rel_ack_num;
if (cp_seq){
buf[0x26+i-1]=tseq;
}else{
buf[0x26+i-1]= 0;
}
rel_ack_num=rel_ack_num>>8;
i--;
}
if (cp_seq==0){
buf[0x26+0]= 0;
buf[0x26+1]= 0;
buf[0x26+2]= seqnum;
buf[0x26+3]= 0;
seqnum+=2;
}
buf[0x32]=0;
buf[0x33]=0;
if (mss){
buf[0x36]=2;
buf[0x36+1]=4;
buf[0x36+2]=0x05;
buf[0x36+3]=0x80;
buf[0x2E]=0x60;
}else{
buf[0x2E]=0x50;
}
}
void make_arp_answer_from_request(unsigned char *buf)
{
unsigned char i=0;
make_eth(buf);
buf[0x14]=0x0;
buf[0x15]=0x02;
while(i<6){
buf[0x20+i]=buf[0x16+i];
buf[0x16+i]=macaddr[i];
i++;
}
i=0;
while(i<4){
buf[0x26+i]=buf[0x1c+i];
buf[0x1c+i]=ipaddr[i];
i++;
}
enc28j60PacketSend(42,buf);
}
void make_echo_reply_from_request(unsigned char *buf,unsigned int len)
{
make_eth(buf);
make_ip(buf);
buf[0x22]=0;
if (buf[0x24] > (0xff-0x08)){
buf[0x24+1]++;
}
buf[0x24]+=0x08;
enc28j60PacketSend(len,buf);
}
void make_udp_reply_from_request(unsigned char *buf,char *data,unsigned char datalen,unsigned char port)
{
unsigned char i=0;
unsigned char ck;
make_eth(buf);
if (datalen>220){
datalen=220;
}
buf[0x10]=0;
buf[0x11]=20+8+datalen;
make_ip(buf);
buf[0x24]=port>>8;
buf[0x25]=port & 0xff;
buf[0x26]=0;
buf[0x27]=8+datalen;
buf[0x28]=0;
buf[0x29]=0;
while(i<datalen){
buf[0x2a+i]=data[i];
i++;
}
ck=checksum(&buf[0x1a], 16 + datalen,1);
buf[0x28]=ck>>8;
buf[0x29]=ck& 0xff;
enc28j60PacketSend(8+20+14+datalen,buf);
}
void make_tcp_synack_from_syn(unsigned char *buf)
{
unsigned char ck;
make_eth(buf);
buf[0x10]=0;
buf[0x11]=20+20+4;
make_ip(buf);
buf[0x2F]=0x12;
make_tcphead(buf,1,1,0);
ck=checksum(&buf[0x1a], 8+20+4,2);
buf[0x32]=ck>>8;
buf[0x33]=ck& 0xff;
enc28j60PacketSend(20+20+4+14,buf);
}
unsigned int get_tcp_data_pointer(void)
{
if (info_data_len)
{
return ((unsigned char)0x22+info_hdr_len);
}
else
{
return(0);
}
}
void init_len_info(unsigned char *buf)
{
info_data_len=(buf[0x10]<<8)|(buf[0x11]&0xff);
info_data_len-=20;
info_hdr_len=(buf[0x2E]>>4)*4;
info_data_len-=info_hdr_len;
if (info_data_len<=0){
info_data_len=0;
}
}
unsigned int fill_tcp_data_p(unsigned char *buf,unsigned int pos,unsigned char *progmem_s)
{
char c;
while ((c = *(progmem_s++))) {
buf[0x33+3+pos]=c;
pos++;
}
return(pos);
}
unsigned int fill_tcp_data(unsigned char *buf,unsigned int pos, unsigned char *s)
{
while (*s)
{
buf[0x33+3+pos]=*s;
pos++;
s++;
}
return(pos);
}
void make_tcp_ack_from_any(unsigned char *buf)
{
unsigned char j;
make_eth(buf);
buf[0x2F]=0x10;
if (info_data_len==0){
make_tcphead(buf,1,0,1);
}else{
make_tcphead(buf,info_data_len,0,1);
}
j=20+20;
buf[0x10]=j>>8;
buf[0x11]=j& 0xff;
make_ip(buf);
j=checksum(&buf[0x1a], 8+20,2);
buf[0x32]=j>>8;
buf[0x33]=j& 0xff;
enc28j60PacketSend(20+20+14,buf);
}
void make_tcp_ack_with_data(unsigned char *buf,unsigned char dlen)
{
unsigned char j;
buf[0x2F]=0x10|0x08|0x01;
j=20+20+dlen;
buf[0x10]=j>>8;
buf[0x11]=j& 0xff;
fill_ip_hdr_checksum(buf);
buf[0x32]=0;
buf[0x33]=0;
j=checksum(&buf[0x1a], 8+20+dlen,2);
buf[0x32]=j>>8;
buf[0x33]=j& 0xff;
enc28j60PacketSend(20+20+dlen+14,buf);
}
void make_arp_request(unsigned char *buf, unsigned char *server_ip)
{
unsigned char i=0;
while(i<6)
{
buf[0 +i]=0xff;
buf[6 +i]=macaddr[i];
i++;
}
buf[ 12 ] = 0x08;
buf[ 13 ] = 0x06;
buf[0x14]=0x00;
buf[0x15]=0x01;
buf[ 0x0E ] = 0x00;
buf[ 0x0F ] = 0x01;
buf[ 0x10 ] = 0x08;
buf[ 0x11 ] = 0x00;
buf[ 0x12 ] = 0x06;
buf[ 0x13 ] = 0x04;
for ( i=0; i<6; i++)
{
buf[ 0x20 + i ] = 0x00;
buf[ 0x16 + i ] = macaddr[i];
}
for ( i=0; i<4; i++)
{
buf[ 0x26 + i ] = server_ip[i];
buf[ 0x1C + i ] = ipaddr[i];
}
enc28j60PacketSend(42,buf);
}
unsigned char arp_packet_is_myreply_arp ( unsigned char *buf )
{
unsigned char i;
if( buf[ 12 ] != 0x08 || buf[ 13 ] != 0x06)
return 0;
if ( buf[ 0x14 ] != 0x00 || buf[ 0x15 ] != 0x02 )
return 0;
for(i=0; i<4; i++){
if(buf[0x26+i] != ipaddr[i]){
return 0;
}
}
return 1;
}
void tcp_client_send_packet(unsigned char *buf,unsigned char dest_port, unsigned char src_port, unsigned char flags, unsigned char max_segment_size,
unsigned char clear_seqack, unsigned char next_ack_num, unsigned char dlength, unsigned char *dest_mac, unsigned char *dest_ip)
{
unsigned char i=0;
unsigned char tseq;
unsigned char ck;
make_eth_ip_new(buf, dest_mac);
buf[0x24]= (unsigned char) ( (dest_port>>8) & 0xff);
buf[0x25]= (unsigned char) (dest_port & 0xff);
buf[0x22]= (unsigned char) ( (src_port>>8) & 0xff);
buf[0x23]= (unsigned char) (src_port & 0xff);
if(next_ack_num)
{
for(i=4; i>0; i--)
{
next_ack_num=buf[0x26+i-1]+next_ack_num;
tseq=buf[0x2A+i-1];
buf[0x2A+i-1]=0xff&next_ack_num;
buf[0x26 + i - 1 ] = tseq;
next_ack_num>>=8;
}
}
if(max_segment_size)
{
buf[0x26+0]= 0;
buf[0x26+1]= 0;
buf[0x26+2]= seqnum;
buf[0x26+3]= 0;
seqnum+=2;
buf[0x36]=2;
buf[0x36+1]=4;
buf[0x36+2]=0x05;
buf[0x36+3]=0x80;
buf[0x2E]=0x60;
dlength +=4;
}
else{
buf[0x2E]=0x50;
}
make_ip_tcp_new(buf,20+20+dlength, dest_ip);
if(clear_seqack)
{
buf[0x2A ] = 0;
buf[0x2A +1] = 0;
buf[0x2A +2] = 0;
buf[0x2A +3] = 0;
}
buf[0x32]=0;
buf[0x33]=0;
buf[0x2F] = flags;
buf[ 0x30 ] = ((600 - 20 - 14)>>8) & 0xff;
buf[ 0x31 ] = (600 - 20 - 14) & 0xff;
buf[ 0x34 ] = 0;
buf[ 0x35 ] = 0;
ck=checksum(&buf[0x1a], 8+20+dlength,2);
buf[0x32]=ck>>8;
buf[0x33]=ck& 0xff;
enc28j60PacketSend(20+20+dlength+14,buf);
}
unsigned int tcp_get_dlength(unsigned char *buf)
{
int dlength, hlength;
dlength = ( buf[ 0x10 ] <<8 ) | ( buf[ 0x11 ] );
dlength -= 20;
hlength = (buf[ 0x2E ]>>4) * 4;
dlength -= hlength;
if ( dlength <= 0 )
dlength=0;
return ((unsigned int)dlength);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -