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

📄 ne2000.lst

📁 51单片机控制网卡实现上网程序代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 + -