Turbo C Context File   d8á´Š^/Ò¤vHSNOOP.CQ8-B-BRELTYPE.ASM/ /SETRECV.ASM$$PKTFIND.ASM 888DRVRINFO.ASMACCTYPE.ASM%2  RECEIVER.ASM>. > >FILTERS.C&#&#USAGE.C'PARSEOPT.C! M MDUMPHEAD.CA==UTILS.Cl]hhe4&"SNOOP.H*.CPPC:\EE\PROJ5\SNOOP.H*.*w void *.c void *.cxŸ} *5CRZdemspacketUDPpktready_flagcaseADDRESS_LENreceived_sreceived_pktsdiscarded_pktsif_typedst_tabledst_tblstdiodst_indexy ADDR_LENz= -)*.CPPRELTYPE.ASMDUMPHEAD.CSETRECV.ASM*.Côõ2'O0'O0 2OO 1 L2'O0'O0X2O-O- 2'O0'O0Ë2=O =O IVM2 O& O&C:\EE\PROJ5\RECEIVER.ASM(4!$4$4H2O0O0C:\EE\PROJ5\UTILS.CL2O&O&C:\EE\PROJ5\SETRECV.ASM$$H2 L/ L/C:\EE\PROJ5\UTILS.C\=OOH2O&O&C:\EE\PROJ5\USAGE.CJ2FFC:\EE\PROJ5\SNOOP.INCL2M$O&C:\EE\PROJ5\PKTFIND.ASM 888H2O&O&C:\EE\PROJ5\USAGE.C'K2O&O&C:\EE\PROJ5\PARSEOPT.CiH M MK2C!C!C:\EE\PROJ5\DUMPHEAD.CA==K2O&O&C:\EE\PROJ5\PARSEOPT.C! M MM2>>C:\EE\PROJ5\RECEIVER.ASM>. > >õFJ2O0>C:\EE\PROJ5\FILTERS.C&#&#H2==C:\EE\PROJ5\UTILS.Cl]hhH2;;C:\EE\PROJ5\SNOOP.CQ8-B-BH2<<C:\EE\PROJ5\SNOOP.H:e2ee2'O0'O02'O0'O0öî% les bx,DWORD PTR [access_type_ptr] mov ax,WORD PTR [es:bx.if_type] push ax mov ah,2H ; prepare to call access_type mov al,BYTE PTR [ES:BX.if_class] mov cx,WORD PTR [ES:BX.typelen] mov dl,BYTE PTR [ES:BX.if_number] lds si,DWORD PTR [ES:BX.type_acc] les di,DWORD PTR [ES:BX.receiver_ptr] pop bx MAC_header->dest[0],MAC_header->dest[1],MAC_header->dest[2], printf("Ethernet destination: %2x:%2x:%2x:%2x:%2x:%2x\n", MAC_header->dest[0],MAC_header->dest[1],MAC_header->dest[2], MAC_header->dest[3],MAC_header->dest[4],MAC_header->dest[5]) void dumpheader(ETHER_HDR far *MAC_header, unsigned length) { printf("Ethernet destination: %2x:%2x:%2x:%2x:%2x:%2x\n", MAC_header->dest[0],MAC_header->dest[1],MAC_header->dest[2], MAC_header->dest[3],MAC_header->dest[4],MAC_header->dest[5]); printf("Ethernet source: %2x:%2x:%2x:%2x:%2x:%2x\n", MAC_header->source[0],MAC_header->source[1],MAC_header->source[2], MAC_header->source[3],MAC_header->source[4],MAC_header->source[5]); } ETHER_HDR far *MAC_header, unsigned length) dest %.2x:%.2x:%.2x:%.2x:%.2x:%.2x #define ETHER_NS_IDP 0x0600 // Xerox NS IDP #define ETHER_IP 0x0800 // IP #define ETHER_X75 0x0801 // X.75 internet #define ETHER_NBS 0x0802 // NBS internet #define ETHER_ECMA 0x0803 // ECMA internet #define ETHER_CHAOS 0x0804 // ChaosNet #define ETHER_X25 0x0805 // X.25, level 3 #define ETHER_ARP 0x0806 // ARP #define ETHER_XNS 0x0807 // XNS compatibility #define ETHER_DEC 0x6003 // DECnet, phase IV #define ETHER_VLN 0x8003 // Cronus VLN #define ETHER_HP 0x8005 // HP Probe #define ETHER_NESTAR 0x8006 // Nestar #define ETHER_EXCELAN 0x8010 // Excelan #define ETHER_RARP 0x8035 // reverse ARP #define ETHER_LAN 0x8038 // DEC LANbridge #define ETHER_APPLE 0x809b // Appletalk #define ETHER_LOOP 0x9000 // loopback ETHER_NS_IDP #define ETHER_ADDRESS_LEN 6 // size of an address // type field codes ((ETHER_HEADER far *)buffer)->type ((ETHER_HEADER far *)buffer)->type printf("type number: %u\n", ((ETHER_HEADER far *)buffer)->type); ; reltype.asm .MODEL SMALL,C INCLUDE snoop.inc PUBLIC reltype .CODE reltype PROC ARG int_vect:WORD,handle:WORD LOCAL int_vect_addr:DWORD USES bx,cx,dx,ds,es,si,di mov ax,int_vect ; load interrupt vector number mov cl,2H ; interrupt vect number * 4 shl ax,cl mov bx,ax ; offset into vector table mov dx,0000H mov es,dx ; make ES point to segment of IVT mov cx,WORD PTR [es:bx] ; get offset mov WORD PTR [int_vect_addr],cx mov cx,WORD PTR [es:bx+2] ; get segment mov WORD PTR [int_vect_addr+2],cx mov ah,3H ; prepare to call release_type mov bx,handle pushf call DWORD PTR [int_vect_addr] mov ax, 0H ; set error status jnc exit neg dh mov al, dh cbw exit: ret ENDP END int reltype(int, int); setrecv(pktdrvint, handle, 6); /* linked list buffer structure */ typedef struct pktbuf_struct { unsigned int pktsize_flag; char far *buffer; struct pktbuf_struct far *next; } pktbuf; current_buffer = (PKTBUF far *)malloc(sizeof(PKTBUF)); (PKTBUF far *)malloc(sizeof(PKTBUF)) volatile unsigned int pktready_flag = 0; current_buffer = current_buffer->next; /* read in command line arguments */ /* snoop.c */ #include #include #include #include #include "snoop.h" /* parseopt.c */ #include #include #include #include #include "snoop.h" fprintf(stderr," -ed, /ed ethernet destination\n"); fprintf(stderr," -es, /es ethernet source\n"); case 's': options[i][j] toupper(options[i][j]) <= 'F') src_tbl[src_index+ if (((options[i][j] <= '9') && (options[i][j] >= '0')) || ((toupper(options[i][j]) <= 'F') && (toupper(options[i][j]) >= 'A'))) #define ASL_4 16 /* S if (options[i][3] == '=') { for (j = 4; options[i][j]; j++) { if ((j-4)%3 < 2) { hex = hex2dec(options[i][j]; if (hex+1) { src_tbl[src_index][(int)((j-4)/3)] += ((j-4)%3)?hex:hex << 4; else status = 1; } } } if (!status) src_index++; else for (j=0; j < 6; j++) src_tbl[src_index][j] = 0; src_tbl[src_index][(int)((j-4)/3)] += ((j-4)%3)?hex:hex << 4; src_index++; status_msg = "Parse error in ethernet address"; status_msg = "Parse error in ethernet destination address"; status_msg = ""; status_msg = ""; status_msg = ""; char src_tbl[256][6]; // 0 out table!! char dst_tbl[256][6]; int src_index=0; int dst_index=0; // 0 out table!! char src_tbl[256][6]; // 0 out table!! char dst_tbl[256][6]; int src_index=0; int dst_index=0; /* parseopt.c */ #include #include #include #include #include "snoop.h" int hex2dec(char value) { if ((value >= '0') && (value <= '9')) return(value-'0'); if ((toupper(value) >= 'A') && (toupper(value) <= 'F')) return(10 + toupper(value) - 'A'); return(-1); } int hex2dec(char value) { void clear_table(char **table) { // 0 out table!! first_buffer = (PKTBUF far *)malloc(sizeof(PKTBUF)); current_buffer = first_buffer; current_buffer->pktsize_flag = 0; current_buffer->buffer = (char far *)malloc(2000*sizeof(char)); current_buffer->next = (PKTBUF far *)malloc(sizeof(PKTBUF)); for(i=0;inext; current_buffer->pktsize_flag = 0; /* buffers */ current_buffer->buffer = (char far *)malloc(2000*sizeof(char)); current_buffer->next = (PKTBUF far *)malloc(sizeof(PKTBUF)); } /* free(current_buffer->next); */ current_buffer->next = first_buffer; /* make linked list circular */ void build_buffers(PKTBUF far **head_buffer) { build_buffers(&first_buffer); /* building link list of N_BUFS */ printf("Found packet driver at 0x%x.\n",(int)pktdrvint); if(drvrinfo(pktdrvint, (DRVR_INFO far *)(&info))) { printf("Packet driver functionality: basic %s%s\n", (info.drvr_functionality&EXTENDED)?("extended "):(""), (info.drvr_functionality&HIGH_PERF)?("high-performance "):("")); printf("Packet driver version: %u\n",info.drvr_version); printf("Packet driver class: %u\n",info.drvr_class); printf("Packet driver number: %u\n",info.drvr_number); printf("Packet driver type: %u\n",info.drvr_type); ptr = _fstrchr(info.drvr_name, '$'); if(ptr) *ptr = '\0'; printf("Found packet driver at 0x%x.\n",(int)pktdrvint); drvrinfo(pktdrvint, (DRVR_INFO far *)(info)) int get_drvrinfo( printf("Packet driver name: %Fs\n",info.drvr_name); int get_drvrinfo(FILE *output, int pktdrvint, DRVR_INFO far *info) { access.if_class = info.drvr_class; access.if_type = info.drvr_type; access.if_number = info.drvr_number; access.typelen = 0; /* if typelen=0, match all pkts */ access.receiver_ptr = receiver; handle = acctype(pktdrvint, &access); int access_type_all(FILE *output, int pktdrvint, DRVR_INFO far *info, ACCESS_TYPE far *access) { ((ETHER_HEADER far *)(current_buffer->buffer))->type = (((ETHER_HEADER far *)(current_buffer->buffer))->type >> 8) + (((ETHER_HEADER far *)(current_buffer->buffer))->type << 8); void type_swap(ETHER_HEADER far *buf) { printf("\nStatistics:\tPackets received - %5u\n", received_pkts); printf( " \tPackets discarded - %5u\n", discarded_pkts); unsigned int received_pkts = 0; void display_stats() { void display_stats(FILE *output) { char far *ptr; int handle; volatile unsigned int discarded_pkts = 0; unsigned int received_pkts = 0; volatile unsigned int discarded_pkts = 0; unsigned int received_pkts = 0; #endif #ifndef SNOOP_MAIN ADDR_TABLE_LEN src_tbl = (char *)malloc(ADDR_TABLE_LEN*sizeof(char *)); ETHER_ADDR_LEN src_tbl[i] = (char *)malloc(ETHER_ADDR_LEN*sizeof(char)); src_tbl = (char **)calloc(ADDR_TABLE_LEN,sizeof(char *)); dst_tbl = (char **)calloc(ADDR_TABLE_LEN,sizeof(char *)); for (i=0; i < ADDR_TABLE_LEN; i++) { src_tbl[i] = (char *)calloc(ETHER_ADDR_LEN,sizeof(char)); dst_tbl[i] = (char *)calloc(ETHER_ADDR_LEN,sizeof(char)); } for (i=0; i < ADDR_TABLE_LEN; i++) for (j=0; j < ETHER_ADDR_LEN; j++) table[i][j] = 0; a int j; [ADDR_TABLE_LEN][ETHER_ADDR_LEN] [ADDR_TABLE_LEN][ETHER_ADDR_LEN] if(eth_filtersrc((ETHER_HEADER far *)(current_buffer->buffer)|| eth_filterdst((ETHER_HEADER far *)(current_buffer->buffer)) { #include #include #include #include #include "snoop.h" #define ETHER_ADDR_LEN 6 // size of an address // type field codes #define ADDR_TABLE_LEN 256 // arbitrary ether tbl len int index; int flag=0; for(index=0; (index < ADDR_TABLE_LEN) && !flag; index++) flag = cmp_eth_addr(src_tbl[index],buf->src); return(flag); } ÿÿ