⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connection.c

📁 embedded ethernet code for pic18F
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -