📄 ne2000.lst
字号:
277 2 myoutportb(CR, 0x12);
278 2 }
279 1 else {
280 2 myoutportb(CR, 0x0A);
281 2 }
282 1 }
283
284 // ********************************************************
285 void read_phy_addr(void) {
286 1 u16_t ignore;
287 1
288 1 remote_dma_setup(FALSE, 0x0000);
289 1
290 1 physical_address[0] = myinportb(NIC_DATA);
291 1 ignore = myinportb(NIC_DATA);
292 1 physical_address[1] = myinportb(NIC_DATA);
293 1 ignore = myinportb(NIC_DATA);
294 1 physical_address[2] = myinportb(NIC_DATA);
295 1 ignore = myinportb(NIC_DATA);
296 1 physical_address[3] = myinportb(NIC_DATA);
297 1 ignore = myinportb(NIC_DATA);
298 1 physical_address[4] = myinportb(NIC_DATA);
299 1 ignore = myinportb(NIC_DATA);
300 1 physical_address[5] = myinportb(NIC_DATA);
301 1 ignore = myinportb(NIC_DATA);
302 1
303 1 ignore=ignore;
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 6
304 1
305 1 }
306
307 // ********************************************************
308 short poll_nic(void) {
309 1
310 1 u16_t in, out;
311 1 u16_t i;
312 1 u16_t status, next_ptr;
313 1 u16_t type;
314 1 u16_t kind;
315 1
316 1
317 1
318 1 myoutportb(CR, 0x62); // Page 1
319 1 in = myinportb(CURR); // Get the current input pointer
320 1 myoutportb(CR, 0x22); // Page 0
321 1 out = myinportb(BNDRY); // Get the current output pointer
322 1
323 1 if (in != out) {
324 2
325 2 // *** Data is present so we better retrieve it
326 2 remote_dma_setup(READ, (u16_t)out<<8);
327 2
328 2 /*status = */
329 2 myinportb(NIC_DATA);
330 2 next_ptr = myinportb(NIC_DATA);
331 2
332 2 // *** Clear out the byte count and dest address
333 2 for (i=0 ; i<8 ; i++)
334 2 myinportb(NIC_DATA);
335 2
336 2 // *** Retrieve source hardware address
337 2 for (i=0 ; i<6 ; i++)
338 2 source_address[i] = myinportb(NIC_DATA);
339 2
340 2 // *** Retrieve ethernet message type
341 2 type = (u16_t)myinportb(NIC_DATA)<<8;
342 2 type = type + myinportb(NIC_DATA);
343 2
344 2 switch (type) {
345 3
346 3 case ARP:
347 3
348 3 #if DEBUG == 1
349 3 trans_str("ARP");
350 3 #endif
351 3
352 3 // discard unneeded bytes (address space, protocol address space,
353 3 // length of hardware address, length of
354 3 // protocol address, opcode)
355 3
356 3 for (i=0; i<8 ; i++)
357 3 myinportb(NIC_DATA);
358 3
359 3 // discard source hardware address (we already have it)
360 3
361 3 for (i=0; i<6 ; i++)
362 3 myinportb(NIC_DATA);
363 3
364 3 // get ip address of packet source
365 3
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 7
366 3 for (i=0; i<4 ; i++)
367 3 source_ip[i] = myinportb(NIC_DATA);
368 3
369 3 // discard target hardware address (probably not valid anyway)
370 3
371 3 for (i=0; i<6 ; i++)
372 3 myinportb(NIC_DATA);
373 3
374 3 // get ip address of destination
375 3
376 3 for (i=0; i<4 ; i++)
377 3 dest_ip[i] = myinportb(NIC_DATA);
378 3
379 3 #if DEBUG == 1
380 3 sprintf(tmpstr,"ARP source ip %d.%d.%d.%d\n", (uint)source_ip[0], (uint)source_ip[1]
381 3 , (uint)source_ip[2], (uint)source_ip[3]);
382 3 trans_str(tmpstr);
383 3 sprintf(tmpstr,"ARP dest ip %d.%d.%d.%d\n", (uint)dest_ip[0], (uint)dest_ip[1]
384 3 , (uint)dest_ip[2], (uint)dest_ip[3]);
385 3 trans_str(tmpstr);
386 3 #endif
387 3
388 3 if (dest_ip[0] == my_ip[0] && dest_ip[1] == my_ip[1] &&
389 3 dest_ip[2] == my_ip[2] && dest_ip[3] == my_ip[3]) {
390 4
391 4 // The ARP was for us, so let's respond
392 4
393 4 arp_response();
394 4
395 4 }
396 3 break;
397 3
398 3 case IP:
399 3 #if DEBUG == 1
400 3 trans_str("IP");
401 3 #endif
402 3
403 3 // Recieve IP Header
404 3
405 3 version = myinportb(NIC_DATA);
406 3 hdr_len = (version & 0x0F) << 2;
407 3 opt_len = hdr_len - 20;
408 3 version = version >> 4 ;
409 3
410 3 // if (hdr_len < 0)
411 3 // break;
412 3
413 3 // discard type of service
414 3
415 3 myinportb(NIC_DATA);
416 3
417 3 // IP packet length
418 3
419 3 IP_length = myinportb(NIC_DATA) << 8;
420 3 IP_length += myinportb(NIC_DATA);
421 3
422 3 // Identification
423 3
424 3 identification = myinportb(NIC_DATA) << 8;
425 3 identification += myinportb(NIC_DATA);
426 3
427 3 // Fragment
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 8
428 3
429 3 fragment = myinportb(NIC_DATA) << 8;
430 3 fragment += myinportb(NIC_DATA);
431 3
432 3 // dicard time to live (the packets already here)
433 3
434 3 myinportb(NIC_DATA);
435 3
436 3 // IP Protocol
437 3
438 3 IP_protocol = myinportb(NIC_DATA);
439 3
440 3 // get header checksum
441 3
442 3 chksum = myinportb(NIC_DATA)<<8;
443 3 chksum += myinportb(NIC_DATA);
444 3
445 3 // get ip address of packet source
446 3
447 3 for (i=0; i<4 ; i++)
448 3 source_ip[i] = myinportb(NIC_DATA);
449 3
450 3 // get ip address of destination
451 3
452 3 for (i=0; i<4 ; i++)
453 3 dest_ip[i] = myinportb(NIC_DATA);
454 3
455 3 trans_str("\n");
456 3
457 3 for (i=0; i<4 ; i++)
458 3 {
459 4 sprintf(tmpstr,"%d.",(uint)source_ip[i]);
460 4 trans_str(tmpstr);
461 4 }
462 3 trans_str("\n->");
463 3 for (i=0; i<4 ; i++)
464 3 {
465 4 sprintf(tmpstr,"%d.",(uint)dest_ip[i]);
466 4 trans_str(tmpstr);
467 4 }
468 3 trans_str("\n");
469 3 // discard options if any
470 3
471 3 for (i=0; i<opt_len ; i++)
472 3 myinportb(NIC_DATA);
473 3
474 3 #if DEBUG == 1
475 3 sprintf(tmpstr,"Option length = %d\n",(uint)opt_len);
476 3 trans_str(tmpstr);
477 3 #endif
478 3
479 3 switch (IP_protocol) {
480 4
481 4 case ICMP:
482 4
483 4 #if DEBUG == 1
484 4 trans_str("-ICMP");
485 4 #endif
486 4
487 4 icmp_type = myinportb(NIC_DATA);
488 4
489 4 if (icmp_type == ECHO) {
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 9
490 5
491 5 #if DEBUG == 1
492 5 trans_str("--PING");
493 5 #endif
494 5
495 5 // This is a PING
496 5
497 5 // retrieve 'code'
498 5 icmp_code = myinportb(NIC_DATA);
499 5
500 5 // retrieve 'checksum'
501 5 icmp_checksum = myinportb(NIC_DATA)<<8;
502 5 icmp_checksum += myinportb(NIC_DATA);
503 5
504 5 // retrieve 'identifier'
505 5 icmp_identifier = myinportb(NIC_DATA)<<8;
506 5 icmp_identifier += myinportb(NIC_DATA);
507 5
508 5 // retrieve 'sequence'
509 5 icmp_sequence = myinportb(NIC_DATA)<<8;
510 5 icmp_sequence += myinportb(NIC_DATA);
511 5
512 5 ping_response();
513 5 }
514 4 // Add other ICMP types here
515 4
516 4 break;
517 4
518 4 case TCP:
519 4
520 4 #if DEBUG == 1
521 4 trans_str("-TCP");
522 4 #endif
523 4
524 4 // retrieve 'source port'
525 4 tcp_source_port = myinportb(NIC_DATA)<<8;
526 4 tcp_source_port += myinportb(NIC_DATA);
527 4
528 4 // retrieve 'destination port'
529 4 tcp_dest_port = myinportb(NIC_DATA)<<8;
530 4 tcp_dest_port += myinportb(NIC_DATA);
531 4
532 4 // We only respond to port 80 (HTML requests)
533 4 if (tcp_dest_port != 80) break;
534 4
535 4 // retrieve sequence number
536 4 seq[0]=myinportb(NIC_DATA)<<8;
537 4 seq[0]+=myinportb(NIC_DATA);
538 4 seq[1]=myinportb(NIC_DATA)<<8;
539 4 seq[1]+=myinportb(NIC_DATA);
540 4
541 4 // retrieve acknowlegment number
542 4 ack[0]=myinportb(NIC_DATA)<<8;
543 4 ack[0]+=myinportb(NIC_DATA);
544 4 ack[1]=myinportb(NIC_DATA)<<8;
545 4 ack[1]+=myinportb(NIC_DATA);
546 4
547 4 // retrieve offset
548 4 offset=(myinportb(NIC_DATA) & 0xF0) >> 2;
549 4 tcp_options = (offset - 20);
550 4
551 4 // retrieve flags
C51 COMPILER V7.09 NE2000 03/27/2005 16:17:14 PAGE 10
552 4 flags=myinportb(NIC_DATA) & 0x3F;
553 4
554 4 if ((flags & TCP_SYN) == TCP_SYN) max_seg=0;
555 4
556 4 // retrieve windows
557 4 window0=myinportb(NIC_DATA) << 8;
558 4 window0+=myinportb(NIC_DATA);
559 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -