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

📄 _gre.c

📁 This directory contains source code for tcpdump, a tool for network monitoring and data acquisition
💻 C
字号:
/*
 * Copyright (c) 1996
 *      The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by the University of California, Lawrence Berkeley Laboratory,
 * Berkeley, CA.  The name of the University may not 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 * Initial contribution from John Hawkinson <jhawk@bbnplanet.com>
 *
 * This module implements support for decoding GRE (Generic Routing
 * Encapsulation) tunnels; they're documented in RFC1701 and RFC1702.
 * This code only supports the IP encapsulation thereof.
 */

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

#include <sys/param.h>
#include <sys/socket.h>

#include "a2name.h"
#include "interfac.h"
#include "extract.h"

#define GRE_SIZE (20)

struct gre {
       u_short flags;
       u_short proto;
       union {
         struct gre_ckof {
           u_short cksum;
           u_short offset;
         } gre_ckof;
         u_int32_t key;
         u_int32_t seq;
       } gre_void1;
       union {
         u_int32_t key;
         u_int32_t seq;
         u_int32_t routing;
       } gre_void2;
       union {
         u_int32_t seq;
         u_int32_t routing;
       } gre_void3;
       union {
         u_int32_t routing;
       } gre_void4;
     };

#define GRE_CP      0x8000  /* Checksum Present */
#define GRE_RP      0x4000  /* Routing Present */
#define GRE_KP      0x2000  /* Key Present */
#define GRE_SP      0x1000  /* Sequence Present */

#define GREPROTO_IP    ETHERTYPE_IP
#define GREPROTO_ARP   ETHERTYPE_ARP
#define GREPROTO_IPV6  0x86dd


/*
 * Deencapsulate and print a GRE-tunneled IP datagram
 */
void gre_print (const u_char *bp, u_int length)
{
  const u_char     *cp = bp + 4;
  const struct gre *gre;
  u_short flags, proto;

  gre = (const struct gre *)bp;

  if (length < GRE_SIZE)
     goto trunc;

  flags = EXTRACT_16BITS(&gre->flags);
  proto = EXTRACT_16BITS(&gre->proto);

  if (vflag)
  {
    /* Decode the flags */
    PUTCHAR ('[');
    if (flags & GRE_CP)
       PUTCHAR ('C');
    if (flags & GRE_RP)
       PUTCHAR ('R');
    if (flags & GRE_KP)
       PUTCHAR ('K');
    if (flags & GRE_SP)
       PUTCHAR ('S');
    PUTS ("] ");
  }
  /* Checksum & Offset are present */
  if ((flags & GRE_CP) | (flags & GRE_RP))
     cp += 4;

  /* We don't support routing fields (variable length) now. Punt. */
  if (flags & GRE_RP)
     return;

  if (flags & GRE_KP)
     cp += 4;
  if (flags & GRE_SP)
     cp += 4;

  length -= cp - bp;
  if (ether_encap_print(cp, proto, length, length) == 0)
     PRINTF ("gre-proto-0x%04X", proto);
  return;

trunc:
  PUTS ("[|gre]");

}

⌨️ 快捷键说明

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