|
|
1.1 root 1: /* test.c - main */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <deqna.h>
6: #include <ether.h>
7: #include <ip.h>
8: #include <arp.h>
9:
10: /*------------------------------------------------------------------------
11: * main -- test ethernet by reading packets
12: *------------------------------------------------------------------------
13: */
14: main()
15: {
16: char buff[1600];
17: struct xx {
18: struct eheader ethead;
19: struct arppak arpout;
20: } outpak;
21: int i, iterate, len;
22: char *p, ch;
23: struct arppak *arpptr;
24: struct epacket *epkptr;
25:
26: /* call buffer pool stuff so 'freebuf' can be mentioned */
27: /* without generating a load-time error */
28: mkpool(10,10);
29:
30: printf("Read %d packets from Ethernet\n", iterate=2);
31: epkptr = (struct epacket *)buff;
32: while (iterate--) {
33: len = read(ETHER, buff, 1500);
34: epkptr->ep_hdr.e_ptype = netorder(epkptr->ep_hdr.e_ptype);
35: if (len == SYSERR) {
36: kprintf("\nError...\n");
37: } else if (epkptr->ep_hdr.e_ptype == EP_ARP) {
38: /* do ARP */ kprintf("ARP...\n");
39: } else {
40: p = (char *)buff;
41: kprintf("\n TYP: %d\n",epkptr->ep_hdr.e_ptype);
42: kprintf(" LEN: %d\n TO: ",len);
43: for (i=0 ; i<6 ; i++)
44: kprintf("%03o ", 0377& *p++);
45: kprintf("\nFROM: ");
46: for (i=0 ; i<6 ; i++)
47: kprintf("%03o ", 0377& *p++);
48: kprintf("\nTYPE: ");
49: kprintf("%03o ", 0377 & *p++);
50: kprintf("%03o ", 0377 & *p++);
51: kprintf("\nDATA: ");
52: for (i=0 ; i<60 ; i++) {
53: ch = *p++;
54: if ( ((ch >= 'a') && (ch <= 'z')) ||
55: ((ch >= 'A') && (ch <= 'Z')) )
56: kprintf("%c",ch);
57: }
58: kprintf("\n");
59: }
60: }
61:
62: kprintf("Preparing to transmit ARP request %d times...\n", iterate=2);
63: /* make up packet */
64:
65: for (i=0 ; i<EPADLEN ; i++) {
66: outpak.ethead.e_dest[i] = 0377;
67: }
68: blkcopy(outpak.ethead.e_src, eth[0].etpaddr, EPADLEN);
69: outpak.ethead.e_ptype = netorder(EP_ARP);
70: outpak.arpout.ar_hrd = netorder(AR_HRD);
71: outpak.arpout.ar_prot = netorder(AR_PROT);
72: outpak.arpout.ar_hlen = AR_HLEN;
73: outpak.arpout.ar_plen = AR_PLEN;
74: outpak.arpout.ar_op = netorder(AR_REQ);
75: for (i=0 ; i<EPADLEN ; i++) {
76: outpak.arpout.ar_sha[i] = eth[0].etpaddr[i];
77: outpak.arpout.ar_tha[i] = (char)0;
78: }
79: dot2ip(outpak.arpout.ar_spa,192,5,48,30); /* xinutest1 */
80: dot2ip(outpak.arpout.ar_tpa,192,5,48,23); /* Lancelot*/
81: epkptr = (struct epacket *) buff;
82: arpptr = (struct arppak *) epkptr->ep_data;
83: while (iterate--) {
84: if ( (len=sizeof(struct xx)) < EMINPAK)
85: len = EMINPAK;
86: kprintf("Sending %d byte packet\n", len);
87: if (write(ETHER, &outpak,len) == SYSERR)
88: kprintf("\nTE\n");
89: len = read(ETHER, buff,1500);
90: epkptr->ep_hdr.e_ptype = netorder(epkptr->ep_hdr.e_ptype);
91: if (len == SYSERR) {
92: kprintf("\nRE\n");
93: } else if (epkptr->ep_hdr.e_ptype == EP_ARP) {
94: kprintf("ARP: len=%d\n",len);
95: kprintf(" FR: %o %o %o %o %o %o\n",
96: epkptr->ep_hdr.e_src[0] &0377,
97: epkptr->ep_hdr.e_src[1] &0377,
98: epkptr->ep_hdr.e_src[2] &0377,
99: epkptr->ep_hdr.e_src[3] &0377,
100: epkptr->ep_hdr.e_src[4] &0377,
101: epkptr->ep_hdr.e_src[5] &0377);
102: kprintf(" TO: %o %o %o %o %o %o\n",
103: epkptr->ep_hdr.e_dest[0] &0377,
104: epkptr->ep_hdr.e_dest[1] &0377,
105: epkptr->ep_hdr.e_dest[2] &0377,
106: epkptr->ep_hdr.e_dest[3] &0377,
107: epkptr->ep_hdr.e_dest[4] &0377,
108: epkptr->ep_hdr.e_dest[5] &0377);
109: kprintf(" OP: %d\n SH: %o %o %o %o %o %o \n",
110: netorder(arpptr->ar_op),
111: arpptr->ar_sha[0] &0377,
112: arpptr->ar_sha[1] &0377,
113: arpptr->ar_sha[2] &0377,
114: arpptr->ar_sha[3] &0377,
115: arpptr->ar_sha[4] &0377,
116: arpptr->ar_sha[5] &0377);
117: kprintf(" SP: %d.%d.%d.%d\n",
118: arpptr->ar_spa[0] &0377,
119: arpptr->ar_spa[1] &0377,
120: arpptr->ar_spa[2] &0377,
121: arpptr->ar_spa[3] &0377);
122: kprintf(" TH: %o %o %o %o %o %o\n TP: %d.%d.%d.%d\n",
123: arpptr->ar_tha[0] &0377,
124: arpptr->ar_tha[1] &0377,
125: arpptr->ar_tha[2] &0377,
126: arpptr->ar_tha[3] &0377,
127: arpptr->ar_tha[4] &0377,
128: arpptr->ar_tha[5] &0377,
129: arpptr->ar_tpa[0] &0377,
130: arpptr->ar_tpa[1] &0377,
131: arpptr->ar_tpa[2] &0377,
132: arpptr->ar_tpa[3] &0377);
133: } else {
134: kprintf("Typ=%o\n",netorder(epkptr->ep_hdr.e_ptype));
135: iterate++;
136: }
137: }
138: }
139:
140: dot2ip(ip, b1, b2, b3, b4)
141: char *ip;
142: int b1, b2, b3, b4;
143: {
144: *ip++ = LOWBYTE & b1;
145: *ip++ = LOWBYTE & b2;
146: *ip++ = LOWBYTE & b3;
147: *ip++ = LOWBYTE & b4;
148: }
149:
150:
151: netorder(i)
152: int i;
153: {
154: char c;
155:
156: return( ((i&0377)<<8) | ((i>>8)&0377) );
157: }
158:
159:
160: blkcopy(to, from, bytes)
161: char *from;
162: char *to;
163: int bytes;
164: {
165: while (bytes-- > 0)
166: *to++ = *from++;
167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.