📄 connection.c
字号:
FLAGS flags;
if(socketInfo[s].est)
{
flags.syn=0;
flags.rst=0;
flags.fin=0;
flags.ack=1;
flags.push=1;
//outBytes=socketInfo[s].callback(0,&flags,packet+TCP_data);
outBytes=socketInfo[s].getData(&flags,packet+TCP_data);
if(flags.fin) socketInfo[s].fin=1;
if((outBytes)||(flags.fin))
{
//putrsUSART("Unsolicited send for socket ");printByte(s);putrsUSART("\r\n");
socketInfo[s].ack=socketInfo[s].seq+outBytes;
//send_tcp_packet(inBytes,outBytes,socketInfo[s].seq,socketInfo[s].clientSeq,flags);
send_tcp_packet(packet,0,outBytes,s,flags);
socketInfo[s].seq+=outBytes;
}
}
}
void doTCPIncoming(unsigned char *packet,unsigned int rxlen)
{
unsigned char s,srcIP[4],srcMAC[6];
unsigned int tcpBytesIn;
unsigned int portaddr;
portaddr = (((unsigned int)packet[TCP_destport])<<8)|packet[TCP_destport+1];
tcpBytesIn = getIPDatagramPayloadLength(packet) - (((packet[TCP_hdrflags] & 0xF0) >> 4) * 4);
if(SYN_IN)
{
s=matchSocketToPacket(portaddr,0,0);
if(s!=255) doSyn(packet,s,tcpBytesIn);
}
else
{
getIPDatagramSourceAddr(packet,srcMAC,srcIP);
s=matchSocketToPacket(portaddr,(((unsigned int)packet[TCP_srcport])<<8)|packet[TCP_srcport+1],srcIP);
if(s!=255)
{
if(ACK_IN && !FIN_IN) doAck(packet,s,tcpBytesIn);
if(FIN_IN && !socketInfo[s].fin) doFin(packet,s,tcpBytesIn);
if(FIN_IN & ACK_IN && socketInfo[s].fin) doFinAck(packet,s,tcpBytesIn);
}
}
}
void handleIncomingTCP(unsigned char *packet,unsigned int rxlen)
{
unsigned char s,srcIP[4],srcMAC[6];
unsigned int tcpBytesIn;
unsigned int portaddr;
//assemble the destination port address from the incoming packet
portaddr = (((unsigned int)packet[TCP_destport])<<8)|packet[TCP_destport+1];
//calculate the length of the data coming in with the packet
//tcpdatalen_in = incoming packet length - incoming ip header length - incoming tcp header length
tcpBytesIn = getIPDatagramPayloadLength(packet) - (((packet[TCP_hdrflags] & 0xF0) >> 4) * 4);
//putrsUSART("TCP packet on socket ");printByte(packet[TCP_destport]);printByte(packet[TCP_destport+1]);
//switch(matchIPDatagramAddress(packet))
//{
// case UNICAST:
// putrsUSART(" Unicast\r\n");
// break;
// case BROADCAST_SUBNET:
// putrsUSART(" Broadcast to subnet\r\n");
// break;
// case BROADCAST:
// putrsUSART(" Broadcast\r\n");
// break;
// default:
// putrsUSART(" Addressing error\r\n");
// break;
// }
// decide which of our sockets it is proposing to use
//putrsUSART("Got packet ");printByte(portaddr>>8);printByte(portaddr&0xff);putrsUSART(" ");
s=matchSocket(portaddr);
//printByte(s);putrsUSART("\r\n");
if(s!=255)
{
if(SYN_IN) doSyn(packet,s,tcpBytesIn);
//putrsUSART("Received packet post SYN\r\n");
else
{
getIPDatagramSourceAddr(packet,srcMAC,srcIP);
if(matchIP(socketInfo[s].ip,srcIP)) // once we've got a session going, you have to be from the right IP; disallows spoofing
{
if(ACK_IN && !FIN_IN) doAck(packet,s,tcpBytesIn);
if(FIN_IN && !socketInfo[s].fin) doFin(packet,s,tcpBytesIn);
if(FIN_IN & ACK_IN && socketInfo[s].fin) doFinAck(packet,s,tcpBytesIn);
}
}
}
//if(ACK_IN && portaddr == MY_PORT_ADDRESS) doAck();
// the output routine - not big or clever
}
void handleOutgoingPacket(unsigned char *packet)
{
unsigned char s;
s=getNextSocket();
if(socketInfo[s].est) doUnsolicitedSend(packet,s);
}
//******************************************************************
//* Send TCP Packet
//* This routine assembles and sends a complete TCP/IP packet.
//* 40 bytes of IP and TCP header data is assumed.
//******************************************************************
void send_tcp_packet(unsigned char *packet,unsigned int inBytes,unsigned int outBytes,unsigned char s,FLAGS flags)
{
unsigned int i,txlen;
unsigned long hdr_chksum;
unsigned int chksum16,tcplen,ip_packet_len;
unsigned char data_L;
//count IP and TCP header bytes.. Total = 40 bytes
if(flags.fin)
{
inBytes++;
socketInfo[s].clientSeq++;
}
ip_packet_len = 40 + outBytes;
setIPDatagramLength(packet,ip_packet_len);
buildIPDatagramHeader(packet,socketInfo[s].mac,socketInfo[s].ip,TCP);
packet[TCP_srcport]=(socketInfo[s].port>>8)&0xff;
packet[TCP_srcport+1]=socketInfo[s].port&0xff;
packet[TCP_destport]=(socketInfo[s].srcPort>>8)&0xff;
packet[TCP_destport+1]=socketInfo[s].srcPort&0xff;
//assemble_ack(inBytes,client_seq);
packet[TCP_seqnum]=(socketInfo[s].seq>>24)&0xff;
packet[TCP_seqnum+1]=(socketInfo[s].seq>>16)&0xff;
packet[TCP_seqnum+2]=(socketInfo[s].seq>>8)&0xff;
packet[TCP_seqnum+3]=socketInfo[s].seq&0xff;
packet[TCP_acknum]=(socketInfo[s].clientSeq>>24)&0xff;
packet[TCP_acknum+1]=(socketInfo[s].clientSeq>>16)&0xff;
packet[TCP_acknum+2]=(socketInfo[s].clientSeq>>8)&0xff;
packet[TCP_acknum+3]=socketInfo[s].clientSeq&0xff;
packet[TCP_hdrflags+1] = 0x00;
if(flags.ack) ACK_OUT;
if(flags.fin) FIN_OUT;
if(flags.push) PSH_OUT;
if(flags.rst) RST_OUT;
if(flags.syn) SYN_OUT;
packet[TCP_cksum] = 0x00;
packet[TCP_cksum+1] = 0x00;
//hdrlen = 0x08;
//addr = &packet[ip_srcaddr];
chksum16=computeIPHeaderChecksum(packet);
packet[TCP_cksum] = (chksum16>>8)&0xff;
packet[TCP_cksum+1] = chksum16&0xff;
txlen = ip_packet_len + 14;
if(txlen < 60) txlen = 60;
echo_packet(txlen,packet);
//putrsUSART("Sending packet with flags ");
//if(flags.syn) putrsUSART("SYN ");
//if(flags.fin) putrsUSART("FIN ");
//if(flags.ack) putrsUSART("ACK ");
//if(flags.rst) putrsUSART("RST ");
//if(flags.push) putrsUSART("(PUSH) ");
//putrsUSART("length ");printByte(outBytes>>8);printByte(outBytes&0xff);
//putrsUSART(" seq ");printByte(socketInfo[s].seq>>8);printByte(socketInfo[s].seq&0xff);
//putrsUSART(" ack ");printByte(socketInfo[s].clientSeq>>8);printByte(socketInfo[s].clientSeq&0xff);
//putrsUSART(" exp ack ");printByte(socketInfo[s].ack>>8);printByte(socketInfo[s].ack&0xff);
//putrsUSART("\r\n");
}
// copied straight from Fred's code
void handleIncomingUDP(unsigned char *packet,unsigned int rxlen)
{
unsigned long hdr_chksum;
unsigned int chksum16;
unsigned char data_L;
unsigned char destIP[4],destMAC[6];
//port 7 is the well-known echo port
if(packet[UDP_destport] == 0x00 && packet[UDP_destport+1] ==0x07)
{
//build the IP header
getIPDatagramSourceAddr(packet,destMAC,destIP);
buildIPDatagramHeader(packet,destMAC,destIP,UDP);
//swap the UDP source and destination ports
data_L = packet[UDP_srcport];
packet[UDP_srcport] = packet[UDP_destport];
packet[UDP_destport] = data_L;
data_L = packet[UDP_srcport+1];
packet[UDP_srcport+1] = packet[UDP_destport+1];
packet[UDP_destport+1] = data_L;
//calculate the UDP checksum
packet[UDP_cksum] = 0x00;
packet[UDP_cksum+1] = 0x00;
chksum16=computeIPHeaderChecksum(packet);
packet[UDP_cksum] = (chksum16>>8)&0xff;
packet[UDP_cksum+1] = chksum16&0xff;
//echo the incoming data back to the VB program
echo_packet(rxlen,packet);
return;
}
//buttons on the VB GUI are pointed towards port address 5000 decimal
else if(packet[UDP_destport] == 0x13 && packet[UDP_destport+1] == 0x88)
{
if(packet[UDP_data] == '0')
//received a "0" from the VB program
PORTAbits.RA5=0;
else if(packet[UDP_data] == '1')
//received a "1" from the VB program
PORTAbits.RA5=1;
else if(packet[UDP_data] == 0x00)
//received a 0x00 from the VB program
PORTA=0;
else if(packet[UDP_data] == 0x01)
//received a 0x01 from the VB program
PORTAbits.RA1=1;
else if(packet[UDP_data] == 0x02)
//received a 0x02 from the VB program
PORTAbits.RA2=1;
else if(packet[UDP_data] == 0x03)
//received a 0x03 from the VB program
PORTAbits.RA3=1;
else if(packet[UDP_data] == 0x04)
//received a 0x04 from the VB program
PORTAbits.RA4=1;
}
//putrsUSART("UDP packet to port ");printByte(packet[UDP_destport]);printByte(packet[UDP_destport+1]);
//switch(matchIPDatagramAddress(packet))
//{
// case UNICAST:
// putrsUSART(" Unicast");
// break;
// case BROADCAST_SUBNET:
// putrsUSART(" Broadcast to subnet");
// break;
// case BROADCAST:
// putrsUSART(" Broadcast");
// break;
// default:
// putrsUSART(" Addressing error");
// break;
// }
//if(packet[UDP_destport] == 0 && packet[UDP_destport+1] == 0x44) putrsUSART(": DHCP - abandoned.\r\n");
//else if(packet[UDP_destport] == 0 && (packet[UDP_destport+1] == 0x89 || packet[UDP_destport+1] == 0x8a)) putrsUSART(": NETbios broadcast - ignored.\r\n");
//else putrsUSART(": Unidentified.\r\n");
}
void handleIncomingPacket(unsigned char *packet)
{
unsigned char type,i;
signed int length;
length=handleNetworkLayer(packet);
if(length>0)
{
type=getIPDatagramType(packet);
if(type==UDP) handleIncomingUDP(packet,length);
else if(type==TCP)
{
//putrsUSART("Handling TCP packet\r\n");
handleIncomingTCP(packet,length);
}
//else
//{
// putrsUSART("Unknown IP datagram type\r\n");
// for(i=0;i<40;i++) printByte(i);
// putrsUSART("\r\n");
// for(i=0;i<40;i++) printByte(packet[i]);
// putrsUSART("\r\n");
//}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -