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

📄 mtest.c

📁 智邦网卡测试程序源码(2张网卡pingpong)
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#include <graph.h>
#include <time.h>
#include "common.h"
#define  SERVER 1
#define  CLIENT 2

//------------------------ Definition ------------------
int     search_packet_driver_vector(int);
void    prepare_send_buffer(char *, int);
void    prepare_magic_packet(char* send_buffer);
int     set_access_type(int,int *,void far *);
int     release_type(int ,int);
int     get_address(int, int, char far *);
int     set_rcv_mode(int, int, int);
int     send_pkt(int, unsigned int, char far *);
int     wait_packet_received(char *, char *, char *, int *);
int     ppong_test(int);
int     init_card1_drv(void);
int     init_card2_drv(void);
int     release_drv(int);
int     check_EEPROM(void);
int     add_ID(void);

// External Variable
void    pascal far receive_handler1();
void    pascal far receive_handler2();
extern  int  init_card1(void);
extern  int  init_card2(void);
extern  int  set_PCI_D3(void);
extern  int  set_PCI_D0(void);
extern  int  chk_ACPI(void);
extern  void Delay10us(unsigned int );
extern  void print_msg(char, char *);
extern  void draw_screen1(void);
extern  void draw_screen2(void);
extern  void PrintLetter(int , unsigned char);
extern  void print_OX(int);
extern  void ShowMacAddress(void);
extern  void ReadCfg(unsigned int [], int,int *);
extern  int scan(void);

//----------------------------------------------------------------------------
static   char packet_signature[]="PKT DRVR";
int      packet_isr1, packet_isr2, packet_handle1, packet_handle2;
int      RxDataLength1, RxDataLength2;
char     ether_id1[6], ether_id2[6];
unsigned char     send_buffer1[3000], send_buffer2[3000];
unsigned char     RxBufferInUse1, RxBufferInUse2;
unsigned char     RxBuffer1[3000], RxBuffer2[3000];
unsigned long tx_count1=0, rx_count1=0, tx_lost1=0, rx_lost1=0, mg_tx_count1=0;
unsigned long tx_count2=0, rx_count2=0, tx_lost2=0, rx_lost2=0, mg_rx_count2=0;

char     error_code,str[80];
int      row=1, WordCount;
unsigned p_len;
unsigned int PM_CSR, s_io_base,c_io_base;
unsigned char s_slot,c_slot;
union REGS inregs,outregs;
struct SREGS segregs;
int server_card;
//========================== Program ====================
int main(void)
{
 unsigned int tmp;
 int result, i;
 char string[10];

// do{
//    draw_screen1();
// }while(scan()!=0);

 draw_screen2();
 server_card = init_card1();

 if( server_card == 0 )
  {
    if(init_card1_drv()!=0)
       return 1;
    }

 _settextwindow(1,1,25,80);
 _settextcolor(WHITE);
 _settextposition(8,57);
 for(i=0;i<6;i++){
    sprintf(str,"%02X ",(unsigned char)ether_id1[i]);
    _outtext(str);
    }

 if(init_card2()==0){
    if(init_card2_drv()!=0){
        print_OX(FAIL);
        if(!release_type(packet_isr1, packet_handle1))
           print_msg(RED, "Card2 ERROR :Cannot deregister a protocol stack.");
        return 2;
        }
    }
 else{
    print_OX(FAIL);
    if(!release_type(packet_isr1, packet_handle1)) {
       print_msg(RED, "Card1 ERROR-3:  cannot deregister a protocol stack.");
       return 3;
       }
    return 2;
    }


 prepare_send_buffer(send_buffer1,SERVER);
 prepare_send_buffer(send_buffer2,CLIENT);
 print_msg(YELLOW,"Useing to 100M mode.");
 print_msg(WHITE,"Start PingPong Test.");


 if(ppong_test(1)!=0){
    print_msg(RED_L,"100M PingPong Test fail....");
    release_drv(FAIL);
    return 1;
    }
 else
    print_msg(GREEN,"100M PingPong Test pass....");


// print_msg(YELLOW,"Switches to 100M mode.");
// outpw(c_io_base+0x62, inpw(c_io_base+0x62)|0x9000);

 print_msg(YELLOW,"Switches to 10M mode.");

 outpw(c_io_base+0x4c, inpw(c_io_base+0x4c) & 0x0cfff);

 for(i=0;i<5;i++){
     //if((inp(c_io_base+0x62) & 0x08!=0) && (inp(s_io_base+0x32)==0x6C)){
//     if(inp(s_io_base+0x32)==0x6C){
//      Delay10us(50000);    // 5/100 sec
//      break;               // check cleint=10M && server=10M
//        }
     Delay10us(1000);       // 1/100 sec
     }

 print_msg(WHITE,"Start PingPong Test.");

 if(ppong_test(2)==0){
    print_msg(GREEN,"10M PingPong Test pass....");
    print_msg(WHITE,"Start ACPI Function Test.");
    print_msg(YELLOW,"Enable PME, Set PCI bus to D3 mode.");
    set_PCI_D3();
    prepare_magic_packet(send_buffer1);
    for(i=0; i<10; i++)
        if(send_pkt(packet_isr1,116,send_buffer1)){
           print_msg(YELLOW,"Sent magic packet !!");
           _settextwindow(1,1,25,80);
           _settextcolor(WHITE);
           sprintf(string,"%6lu",++mg_tx_count1);
           _settextposition(12,61);
           _outtext(string);
           break;
           }
    if(chk_ACPI()==0){
       print_msg(YELLOW,"Magic packet received !!");
       _settextwindow(1,1,25,80);
       _settextcolor(WHITE);
       _settextposition(17,21);
       sprintf(string,"%6lu",++mg_rx_count2);
       _outtext(string);
       print_msg(YELLOW,"Set PCI bus to D0 mode.");
       set_PCI_D0();
       print_msg(GREEN,"ACPI Function Test Ok!!.");
       release_drv(SUCCESS);
       return 0;
       }
    else{
       print_msg(RED_L,"ACPI function Test Fail....");
       print_msg(YELLOW,"Set PCI bus to D0 mode.");
       set_PCI_D0();
       }
    }
 else
    print_msg(RED_L,"10M PingPong Test Fail....");

 release_drv(FAIL);
 return 1;

}
// ---------------------- Sub Function ------------------
int search_packet_driver_vector(int card_num)
{
        int     vector_no;
        int     done_flag=0;
        int far *ptr;
        char far *packet_driver_entry;
        int     x, y, i;
        char    signature[10];

        for(vector_no=0x60; (vector_no<0x81) && (done_flag!=card_num); vector_no++) {
            ptr = _MK_FP (0x00, (vector_no*4));               //
            x= *(ptr+1);                                      //
            y= *ptr;                                          // search for keyword
            packet_driver_entry = _MK_FP (x,y);               // "PKT DRVR"
            for(i=0;i<9;i++)                                // 3 bytes for JUMP instruction
                signature[i]= *(packet_driver_entry+3+i); //
            if(strcmp (packet_signature, signature)==0)
                done_flag++;
            }
        vector_no--;
        if(done_flag)
           return vector_no;
        return 0;
}
// ******************************
void    prepare_send_buffer(char* send_buffer,int chk)
{
 int     i;
 char    tempc;

 if(chk==SERVER){
    for(i=0;i<6;i++)
        send_buffer[i]=ether_id2[i];
    for(i=6;i<12;i++)
        send_buffer[i]=ether_id1[i-6];
    }
 else{
    for(i=0;i<6;i++)
        send_buffer[i]=ether_id1[i];
    for(i=6;i<12;i++)
        send_buffer[i]=ether_id2[i-6];
    }

 for(i=14;i<3000;i++)
   send_buffer[i]=0x00;

 send_buffer[12]=0xac;
 send_buffer[13]=0xca;
 tempc=0x30;
 for(i=14;i<3000;i++) {
     send_buffer[i]=tempc;
     if(++tempc > 0x5a)
        tempc=0x30;
     }

}
// ******************************
void    prepare_magic_packet(char* send_buffer)
{
 int     i,j;

    for(i=0;i<6;i++)
        send_buffer[i]=ether_id2[i];
    for(;i<12;i++)
        send_buffer[i]=ether_id1[i];

 send_buffer[12]=0x00;   // packet length
 send_buffer[13]=102;

 for(i=14;i<20;i++)
     send_buffer[i]=0xff;

 for(i=0;i<16;i++)
     for(j=0;j<6;j++)
         send_buffer[20+i*6+j]=ether_id2[j];
}
// ******************************

int     set_access_type(int packet_isr,int *packet_handle,void far *tr)
{
 union   _REGS   inregs, outregs;
 struct  _SREGS  segregs;
 char   type_string[2]={0xac,0xca};
 char far *ts= type_string;

 inregs.h.al=0x01;               // AL=0x01 if_class
 inregs.h.ah=0x02;               // AH=0x02 access_type()
 inregs.x.bx=0xffff;             // BX=-1   if_type
 inregs.h.dl=0;                  // DL=0 if_number
 inregs.x.cx=2;                  // CX=2 type length
 segregs.ds= _FP_SEG (ts);       // DS:SI type
 inregs.x.si= _FP_OFF (ts);
 segregs.es= _FP_SEG (tr);       // ES:DI *receiver
 inregs.x.di= _FP_OFF (tr);
 _int86x (packet_isr, &inregs, &outregs, &segregs);

 if(outregs.x.cflag)
    return FALSE;
  else{
    *packet_handle= outregs.x.ax;
    return TRUE;
    }
}
// ******************************
int     release_type(int packet_isr, int packet_handle)
{
 union   _REGS   inregs, outregs;
 struct  _SREGS  segregs;

 inregs.h.ah=0x03;               // AH=0x02 release_type()
 inregs.x.bx=packet_handle;      // BX= handle
 _int86x (packet_isr, &inregs, &outregs, &segregs);
 return (!outregs.x.cflag);
}
// ******************************

int get_address(int packet_isr, int packet_handle, char far *ei)
{
 union   _REGS   inregs, outregs;
 struct  _SREGS  segregs;

 inregs.h.ah=0x06;               // AH=0x02 get_address()
 inregs.x.bx=packet_handle;      // BX= handle
 inregs.x.cx=0x06;               // CX= buffer length

 segregs.es= _FP_SEG (ei);       // ES:DI buffer pointer
 inregs.x.di= _FP_OFF (ei);
 _int86x (packet_isr, &inregs, &outregs, &segregs);

 if((outregs.x.cflag)||(outregs.x.cx<6))
     return (FALSE);
 return (TRUE);
}

// ********************************
int set_rcv_mode(int packet_isr,int packet_handle,int mode)
{
 union   _REGS   inregs, outregs;
 struct  _SREGS  segregs;

 inregs.h.ah=20;               // AH=20 set_rcv_mode()
 inregs.x.bx=packet_handle;    // BX= handle
 inregs.x.cx=mode;             // CX= rcv mode

 _int86x (packet_isr, &inregs, &outregs, &segregs);
 return (!outregs.x.cflag);
}
// ********************************

int send_pkt(int packet_isr, unsigned int length, char far *sb)
{
 union   _REGS   inregs, outregs;
 struct  _SREGS  segregs;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -