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

📄 _arp.c

📁 This directory contains source code for tcpdump, a tool for network monitoring and data acquisition
💻 C
字号:
/* 
 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
 *      The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that: (1) source code distributions
 * retain the above copyright notice and this paragraph in its entirety, (2)
 * distributions including binary code include the above copyright notice and
 * this paragraph in its entirety in the documentation or other materials
 * provided with the distribution, and (3) all advertising materials mentioning
 * features or use of this software display the following acknowledgement:
 * ``This product includes software developed by the University of California,
 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
 * the University nor the names of its contributors may be used to endorse
 * or promote products derived from this software without specific prior
 * written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

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

#include <sys/param.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>

#include "interfac.h"
#include "ethertyp.h"
#include "extract.h"                /* must come after interface.h */
#include "a2name.h"

/* Compatibility */
#ifndef REVARP_REQUEST
#define REVARP_REQUEST  3
#endif

#ifndef REVARP_REPLY
#define REVARP_REPLY    4
#endif

static u_char ezero[6];

void arp_print (const u_char *bp, u_int length, u_int caplen)
{
  const struct ether_arp    *ap;
  const struct ether_header *eh;
  u_short pro, hrd, op;

  ap = (struct ether_arp *) bp;
  if ((u_char *) (ap + 1) > snapend)
  {
    PUTS ("[|arp]");
    return;
  }
  if (length < sizeof(struct ether_arp))
  {
    if (partial_frame)
         PUTS ("[||arp]");
    else PUTS ("truncated-arp");
    default_print ((u_char *) ap, length);
    return;
  }

  pro = EXTRACT_16BITS (&ap->arp_pro);
  hrd = EXTRACT_16BITS (&ap->arp_hrd);
  op  = EXTRACT_16BITS (&ap->arp_op);

  if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) ||
      ap->arp_hln != sizeof(SHA(ap)) || ap->arp_pln != sizeof(SPA(ap)))
  {
    PRINTF ("arp-#%d for proto #%d (%d) hardware #%d (%d)",
            op, pro, ap->arp_pln, hrd, ap->arp_hln);
    return;
  }
  if (pro == ETHERTYPE_TRAIL)
     PUTS ("trailer-");

  eh = (struct ether_header *) packetp;
  switch (op)
  {
    case ARPOP_REQUEST:
         PRINTF ("arp who-has %s", ipaddr_string(TPA(ap)));
         if (memcmp(ezero,THA(ap),6))
            PRINTF (" (%s)", etheraddr_string(THA(ap)));
         PRINTF (" tell %s", ipaddr_string(SPA(ap)));
         if (memcmp (ESRC(eh),SHA(ap),6))
            PRINTF (" (%s)", etheraddr_string(SHA(ap)));
         break;

    case ARPOP_REPLY:
         PRINTF ("arp reply %s", ipaddr_string(SPA(ap)));
         if (memcmp(ESRC(eh),SHA(ap),6))
            PRINTF (" (%s)", etheraddr_string(SHA(ap)));
         PRINTF (" is-at %s", etheraddr_string(SHA(ap)));
         if (memcmp(EDST(eh),THA(ap),6))
            PRINTF (" (%s)", etheraddr_string(THA(ap)));
         break;

    case REVARP_REQUEST:
         PRINTF ("rarp who-is %s tell %s",
                 etheraddr_string(THA(ap)), etheraddr_string(SHA(ap)));
         break;

    case REVARP_REPLY:
         PRINTF ("rarp reply %s at %s",
                 etheraddr_string(THA(ap)), ipaddr_string(TPA(ap)));
         break;

    default:
         PRINTF ("arp-#%d", op);
         default_print ((u_char *)ap, caplen);
         return;
     }
  if (hrd != ARPHRD_ETHER)
     PRINTF (" hardware #%d", ap->arp_hrd);
}

⌨️ 快捷键说明

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