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

📄 pcrarp.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
字号:
/*
 *   RARP - Boot Protocol (RFC 903)
 *
 *   These extensions get called if MY_IP is set to RARP in wattcp.cfg
 *
 *   Version
 *
 *   0.0 : Sept 6, 1996 : Copied from E. Engelke's pcbootp.c by Dan Kegel
 *   0.1 : Febr 9, 1997 : Modified, removed debug printing,  G. Vanem
 */

#include <stdio.h>
#include <string.h>

#include "copyrigh.h"
#include "wattcp.h"
#include "strings.h"
#include "language.h"
#include "misc.h"
#include "pcsed.h"
#include "pctcp.h"
#include "pcdbug.h"
#include "pcrarp.h"

WORD _rarptimeout = 15;

static int _rarp_request (void)
{
  rarp_Header *rarp = (rarp_Header*) _eth_formatpacket (&_eth_brdcast[0],
                                                        RARP_TYPE);
  rarp->hwType       = intel16 (_eth_get_hwtype(NULL,NULL));
  rarp->protType     = IP_TYPE;
  rarp->hwAddrLen    = sizeof (mac_address);
  rarp->protoAddrLen = sizeof (DWORD);
  rarp->opcode       = RARP_REQUEST;
  rarp->srcIPAddr    = 0;
  rarp->dstIPAddr    = 0;
  memcpy (rarp->srcEthAddr, _eth_addr, sizeof(mac_address));
  memcpy (rarp->dstEthAddr, _eth_addr, sizeof(mac_address));

  DEBUG_TX (NULL, rarp);
  return _eth_send (sizeof(*rarp));
}

/*
 * _dorarpc - Checks global variable _rarptimeout
 *            returns 1 on success and sets ip address
 */
int _dorarp (void)
{
  struct rarp_Header *rarp = NULL;
  DWORD  rarptimeout       = set_timeout (1000 * _rarptimeout);
  WORD   protocol          = 0;
  WORD   magictimeout      = Random (7000, 14000);
  BOOL   link_broadcast    = FALSE;

  outs (_LANG("Configuring through RARP..."));

  while (1)
  {
    DWORD sendtimeout;

    if (!_rarp_request())
       return (0);

    sendtimeout = set_timeout (magictimeout);
    magictimeout += Random (1000, 7000);

    while (!chk_timeout(sendtimeout))
    {
      if (chk_timeout(rarptimeout))
         goto quit;

      kbhit();
      rarp = (rarp_Header*) _eth_arrived (&protocol, &link_broadcast);
      if (rarp && protocol == RARP_TYPE)
      {
        DEBUG_RX (NULL, rarp);
        if (protocol == RARP_TYPE && !link_broadcast &&
            rarp->opcode == RARP_REPLY)
        {
          my_ip_addr = intel (rarp->dstIPAddr);
          goto quit;
        }
      }
    }
  }

quit:
  if (rarp)
     _eth_free (rarp, protocol);

  return (my_ip_addr != 0);
}

⌨️ 快捷键说明

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