📄 ne2000.lst
字号:
560 4 // discard checksum
561 4 myinportb(NIC_DATA);
562 4 myinportb(NIC_DATA);
563 4
564 4 // discard urgent pointer
565 4 myinportb(NIC_DATA);
566 4 myinportb(NIC_DATA);
567 4
568 4
569 4 // Handle options
570 4 for (i=0 ; i < tcp_options ; i++) {
571 5 kind = myinportb(NIC_DATA);
572 5 switch (kind) {
573 6 case 2:
574 6 myinportb(NIC_DATA);
575 6 if ((flags & TCP_SYN) == TCP_SYN) {
576 7 max_seg = myinportb(NIC_DATA) << 8;
577 7 max_seg += myinportb(NIC_DATA);
578 7 } else {
579 7 myinportb(NIC_DATA);
580 7 myinportb(NIC_DATA);
581 7 }
582 6 i=i+3;
583 6 case 0:
584 6 case 1:
585 6 break;
586 6 }
587 5
588 5 }
589 4
590 4 tcp_response();
591 4
592 4 break;
593 4
594 4 case UDP:
595 4
596 4 #if DEBUG == 1
597 4 trans_str("-UDP");
598 4 #endif
599 4
600 4 break;
601 4 }
602 3
603 3
604 3 }
605 2
606 2 myoutportb(CR, 0x22);
607 2 myoutportb(BNDRY, next_ptr);
608 2
609 2 return FALSE;
610 2 }
611 1 return TRUE;
612 1 }
*** WARNING C280 IN LINE 312 OF NE2000.C: 'status': unreferenced local variable
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 11
613
614 // ********************************************************
615 void arp_response(void) {
616 1
617 1 u16_t i;
618 1
619 1 // prepare ethernet packet
620 1
621 1 load_ethernet_header();
622 1
623 1 // packet type
624 1
625 1 myoutportb(NIC_DATA, ARP >> 8);
626 1 myoutportb(NIC_DATA, ARP );
627 1
628 1 // hardware type (0x0001 = ethernet)
629 1
630 1 myoutportb(NIC_DATA, 0x00);
631 1 myoutportb(NIC_DATA, 0x01);
632 1
633 1 // protocol type (0x0800 = IP)
634 1
635 1 myoutportb(NIC_DATA, 0x08);
636 1 myoutportb(NIC_DATA, 0x00);
637 1
638 1 // hardware address length (6 bytes)
639 1
640 1 myoutportb(NIC_DATA, 0x06);
641 1
642 1 // protocol address length (4 bytes)
643 1
644 1 myoutportb(NIC_DATA, 0x04);
645 1
646 1 // opcode (ARP reply)
647 1
648 1 myoutportb(NIC_DATA, 0x00);
649 1 myoutportb(NIC_DATA, 0x02);
650 1
651 1 // my hardware address
652 1
653 1 for (i=0 ; i<6 ; i++)
654 1 myoutportb(NIC_DATA, physical_address[i]);
655 1
656 1 // my ip address
657 1
658 1 for (i=0 ; i<4 ; i++)
659 1 myoutportb(NIC_DATA, my_ip[i]);
660 1
661 1 // source hardware address
662 1
663 1 for (i=0 ; i<6 ; i++)
664 1 myoutportb(NIC_DATA, source_address[i]);
665 1
666 1 // source ip address
667 1
668 1 for (i=0 ; i<4 ; i++)
669 1 myoutportb(NIC_DATA, source_ip[i]);
670 1
671 1 // pad to 46 bytes (46-28=18)
672 1
673 1 for (i=0 ; i<18 ;i++)
674 1 myoutportb(NIC_DATA, 0x00);
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 12
675 1
676 1 // packet assmebled so let's send it
677 1
678 1 send_packet(60);
679 1
680 1 }
681
682 // ********************************************************
683 void load_ethernet_header(void) {
684 1
685 1 u16_t i;
686 1
687 1 remote_dma_setup(WRITE, XMT_BUF_START << 8);
688 1
689 1 // write hardware addresses
690 1
691 1 for(i=0 ; i<6 ; i++)
692 1 myoutportb(NIC_DATA, source_address[i]);
693 1 for(i=0 ; i<6 ; i++)
694 1 myoutportb(NIC_DATA, physical_address[i]);
695 1
696 1 }
697
698 // ********************************************************
699 void send_packet(u16_t len) {
700 1
701 1 myoutportb(CR, 0x22);
702 1 myoutportb(TBCR0, len );
703 1 myoutportb(TBCR1, len >> 8);
704 1 myoutportb(TPSR, XMT_BUF_START);
705 1 myoutportb(CR, 0x26);
706 1 }
707
708 // ********************************************************
709 void ping_response() {
710 1
711 1 u16_t prev_chksum;
712 1 u16_t i;
713 1
714 1 // prepare ethernet packet
715 1 load_ethernet_header(); // Load MAC source and destination addresses
716 1
717 1 // prepare IP header
718 1 load_IP_header(28,ICMP); // load IP header
719 1
720 1 chksum=0;
721 1
722 1 myoutportw(NIC_DATA, (u16_t)icmp_code); // Type = 0 (echo reply)
723 1
724 1 prev_chksum=chksum;
725 1 chksum += icmp_identifier;
726 1 if (chksum<prev_chksum) chksum++;
727 1
728 1 prev_chksum=chksum;
729 1 chksum += icmp_sequence;
730 1 if (chksum<prev_chksum) chksum++;
731 1
732 1 myoutportw(NIC_DATA, ~chksum);
733 1
734 1 myoutportw(NIC_DATA, icmp_identifier);
735 1
736 1 myoutportw(NIC_DATA, icmp_sequence);
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 13
737 1
738 1 for (i=0 ; i<18 ; i++)
739 1 myoutportb(NIC_DATA, 0x00); // pad to 60 bytes + 4 for CRC = 64 (min ethernet packet)
740 1
741 1 send_packet(60);
742 1
743 1 }
744
745 // ********************************************************
746 void load_IP_header(u16_t IP_packet_length, u16_t IP_send_protocol) {
747 1
748 1 u16_t i;
749 1 u16_t prev_chksum;
750 1
751 1 myoutportb(NIC_DATA, IP >> 8); // IP packet
752 1 myoutportb(NIC_DATA, IP);
753 1
754 1 chksum = 0;
755 1
756 1 myoutportw(NIC_DATA, 0x4500);
757 1
758 1 myoutportw(NIC_DATA, IP_packet_length);
759 1
760 1 myoutportw(NIC_DATA, identification);
761 1
762 1 myoutportw(NIC_DATA, 0x0000); // Okay to fragment
763 1
764 1 myoutportw(NIC_DATA, 0xFF00 + IP_send_protocol);
765 1 // Time-To-Live set to max 255
766 1
767 1 prev_chksum = chksum;
768 1 chksum += ((u16_t)my_ip[0]<<8) + my_ip[1];
769 1 if (chksum < prev_chksum) chksum++;
770 1
771 1 prev_chksum = chksum;
772 1 chksum += ((u16_t)my_ip[2]<<8) + my_ip[3];
773 1 if (chksum < prev_chksum) chksum++;
774 1
775 1 prev_chksum = chksum;
776 1 chksum += ((u16_t)source_ip[0]<<8) + source_ip[1];
777 1 if (chksum < prev_chksum) chksum++;
778 1
779 1 prev_chksum = chksum;
780 1 chksum += ((u16_t)source_ip[2]<<8) + source_ip[3];
781 1 if (chksum < prev_chksum) chksum++;
782 1
783 1 #if DEBUG > 1
trans_str("-----");
trans_str("4500");
sprintf(tmpstr,"%X\n",(uint)IP_packet_length);
trans_str(tmpstr);
sprintf(tmpstr,"%X\n",(uint)identification);
trans_str(tmpstr);
trans_str("0000");
sprintf(tmpstr,"%X\n",(uint)(0xFF00+IP_send_protocol));
trans_str(tmpstr);
sprintf(tmpstr,"%X\n",(uint)(~chksum));
trans_str(tmpstr);
sprintf(tmpstr,"%X%X\n",(uint)my_ip[0],(uint)my_ip[1]);
trans_str(tmpstr);
sprintf(tmpstr,"%X%X\n",(uint)my_ip[2],(uint)my_ip[3]);
trans_str(tmpstr);
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 14
sprintf(tmpstr,"%X%X\n",(uint)source_ip[0],(uint)source_ip[1]);
trans_str(tmpstr);
sprintf(tmpstr,"%X%X\n",(uint)source_ip[2],(uint)source_ip[3]);
trans_str(tmpstr);
#endif
804 1
805 1 myoutportw(NIC_DATA, ~chksum); // Header Checksum
806 1
807 1 for (i=0 ; i<4 ; i++) // source IP address for this packet
808 1 myoutportb(NIC_DATA, my_ip[i]);
809 1
810 1 for (i=0 ; i<4 ; i++) // destination IP address for this packet
811 1 myoutportb(NIC_DATA, source_ip[i]);
812 1
813 1
814 1 }
815
816 // ********************************************************
817 void tcp_response(void) {
818 1
819 1 u16_t i;
820 1
821 1 switch (html_socket) {
822 2
823 2 case LISTEN:
824 2 trans_str("L");
825 2
826 2 // *** We are expecting a SYN without an ACK
827 2 // *** Could get a RST, FIN, PSH or URG but we'll ignore the PSH or URG
828 2 if (flags & TCP_SYN) {
829 3 // SYN set
830 3 // We should check to be sure an ACK wasn't also sent
831 3 if (flags & TCP_ACK) {
832 4 break; // Ignore it for now. We'll add code to handle later
833 4 }
834 3 // We shouldn't have a RST or FIN with a SYN
835 3 if (flags & TCP_RST || flags & TCP_FIN) {
836 4 break; // Ignore it for now. We'll add code to hanlde later
837 4 }
838 3 // Everything looks okay so handle the SYN request
839 3 // Save the senders sequence number
840 3
841 3 tcp_listen();
842 3
843 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -