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

📄 _decnet.c

📁 This directory contains source code for tcpdump, a tool for network monitoring and data acquisition
💻 C
📖 第 1 页 / 共 2 页
字号:
           case MFS_EOM:
           case MFS_BOM + MFS_EOM:
                PRINTF ("data %d>%d ", src, dst);
                {
                  struct seghdr *shp = (struct seghdr *) nspp;
                  int    ack;
                  u_char *dp;
                  u_int  data_off = sizeof(struct minseghdr);

                  ack = EXTRACT_LE_16BITS (shp->sh_seq[0]);
                  if (ack & SGQ_ACK)
                  {             /* acknum field */
                    if ((ack & SGQ_NAK) == SGQ_NAK)
                         PRINTF ("nak %d ", ack & SGQ_MASK);
                    else PRINTF ("ack %d ", ack & SGQ_MASK);
                    ack = EXTRACT_LE_16BITS (shp->sh_seq[1]);
                    data_off += sizeof(short);

                    if (ack & SGQ_OACK)
                    {          /* ackoth field */
                      if ((ack & SGQ_ONAK) == SGQ_ONAK)
                           PRINTF ("onak %d ", ack & SGQ_MASK);
                      else PRINTF ("oack %d ", ack & SGQ_MASK);
                      ack = EXTRACT_LE_16BITS (shp->sh_seq[2]);
                      data_off += sizeof(short);
                    }
                  }
                  PRINTF ("seg %d ", ack & SGQ_MASK);
#ifdef PRINT_DECNET_DETAILS
                  dp = (u_char *) &nspp[data_off];
                  pdata (dp, 10);
#endif
                }
                break;

           case MFS_ILS + MFS_INT:
                PUTS ("intr ");
                {
                  struct seghdr *shp = (struct seghdr *) nspp;
                  int    ack;
                  u_char *dp;
                  u_int  data_off = sizeof(struct minseghdr);

                  ack = EXTRACT_LE_16BITS (shp->sh_seq[0]);
                  if (ack & SGQ_ACK)
                  {             /* acknum field */
                    if ((ack & SGQ_NAK) == SGQ_NAK)
                         PRINTF ("nak %d ", ack & SGQ_MASK);
                    else PRINTF ("ack %d ", ack & SGQ_MASK);
                    ack = EXTRACT_LE_16BITS (shp->sh_seq[1]);
                    data_off += sizeof(short);

                    if (ack & SGQ_OACK)
                    {           /* ackdat field */
                      if ((ack & SGQ_ONAK) == SGQ_ONAK)
                           PRINTF ("nakdat %d ", ack & SGQ_MASK);
                      else PRINTF ("ackdat %d ", ack & SGQ_MASK);
                      ack = EXTRACT_LE_16BITS (shp->sh_seq[2]);
                      data_off += sizeof(short);
                    }
                  }
                  PRINTF ("seg %d ", ack & SGQ_MASK);
#ifdef PRINT_DECNET_DETAILS
                  dp = (u_char *) &nspp[data_off];
                  pdata (dp, 10);
#endif
                }
                break;

           case MFS_ILS:
                PRINTF ("link-service %d>%d ", src, dst);
                {
                  struct  seghdr *shp = (struct seghdr*) nspp;
                  struct  lsmsg *lsmp = (struct lsmsg *) &nspp[sizeof(struct seghdr)];
                  int     ack, lsflags, fcval;

                  ack = EXTRACT_LE_16BITS (shp->sh_seq[0]);
                  if (ack & SGQ_ACK)
                  {             /* acknum field */
                    if ((ack & SGQ_NAK) == SGQ_NAK)
                         PRINTF ("nak %d ", ack & SGQ_MASK);
                    else PRINTF ("ack %d ", ack & SGQ_MASK);
                    ack = EXTRACT_LE_16BITS (shp->sh_seq[1]);
                    if (ack & SGQ_OACK)
                    {           /* ackdat field */
                      if ((ack & SGQ_ONAK) == SGQ_ONAK)
                           PRINTF ("nakdat %d ", ack & SGQ_MASK);
                      else PRINTF ("ackdat %d ", ack & SGQ_MASK);
                      ack = EXTRACT_LE_16BITS (shp->sh_seq[2]);
                    }
                  }
                  PRINTF ("seg %d ", ack & SGQ_MASK);
                  lsflags = EXTRACT_LE_8BITS (lsmp->ls_lsflags);
                  fcval = EXTRACT_LE_8BITS (lsmp->ls_fcval);
                  switch (lsflags & LSI_MASK)
                  {
                    case LSI_DATA:
                         PRINTF ("dat seg count %d ", fcval);
                         switch (lsflags & LSM_MASK)
                         {
                           case LSM_NOCHANGE:
                                break;
                           case LSM_DONOTSEND:
                                PUTS ("donotsend-data ");
                                break;
                           case LSM_SEND:
                                PUTS ("send-data ");
                                break;
                           default:
                                PRINTF ("reserved-fcmod? %x", lsflags);
                                break;
                         }
                         break;
                    case LSI_INTR:
                         PRINTF ("intr req count %d ", fcval);
                         break;
                    default:
                         PRINTF ("reserved-fcval-int? %x", lsflags);
                         break;
                  }
                }
                break;

           default:
                PRINTF ("reserved-subtype? %x %d > %d", flags, src, dst);
                break;
         }
         break;

    case MFT_ACK:
         switch (flags & NSP_SUBMASK)
         {
           case MFS_DACK:
                PRINTF ("data-ack %d>%d ", src, dst);
                {
                  struct ackmsg *amp = (struct ackmsg *) nspp;
                  int    ack = EXTRACT_LE_16BITS (amp->ak_acknum[0]);
                  if (ack & SGQ_ACK)
                  {             /* acknum field */
                    if ((ack & SGQ_NAK) == SGQ_NAK)
                         PRINTF ("nak %d ", ack & SGQ_MASK);
                    else PRINTF ("ack %d ", ack & SGQ_MASK);
                    ack = EXTRACT_LE_16BITS (amp->ak_acknum[1]);
                    if (ack & SGQ_OACK)
                    {           /* ackoth field */
                      if ((ack & SGQ_ONAK) == SGQ_ONAK)
                           PRINTF ("onak %d ", ack & SGQ_MASK);
                      else PRINTF ("oack %d ", ack & SGQ_MASK);
                    }
                  }
                }
                break;

           case MFS_IACK:
                PRINTF ("ils-ack %d>%d ", src, dst);
                {
                  struct ackmsg *amp = (struct ackmsg *) nspp;
                  int    ack = EXTRACT_LE_16BITS (amp->ak_acknum[0]);
                  if (ack & SGQ_ACK)
                  {             /* acknum field */
                    if ((ack & SGQ_NAK) == SGQ_NAK)
                         PRINTF ("nak %d ", ack & SGQ_MASK);
                    else PRINTF ("ack %d ", ack & SGQ_MASK);
                    ack = EXTRACT_LE_16BITS (amp->ak_acknum[1]);
                    if (ack & SGQ_OACK)
                    {           /* ackdat field */
                      if ((ack & SGQ_ONAK) == SGQ_ONAK)
                           PRINTF ("nakdat %d ", ack & SGQ_MASK);
                      else PRINTF ("ackdat %d ", ack & SGQ_MASK);
                    }
                  }
                }
                break;

           case MFS_CACK:
                PRINTF ("conn-ack %d", dst);
                break;

           default:
                PRINTF ("reserved-acktype? %x %d > %d", flags, src, dst);
                break;
         }
         break;

    case MFT_CTL:
         switch (flags & NSP_SUBMASK)
         {
           case MFS_CI:
           case MFS_RCI:
                if ((flags & NSP_SUBMASK) == MFS_CI)
                     PRINTF ("conn-initiate ");
                else PRINTF ("retrans-conn-initiate ");
                PRINTF ("%d>%d ", src, dst);
                {
                  struct cimsg *cimp = (struct cimsg *) nspp;
                  int    services, info, segsize;
                  u_char *dp;

                  services = EXTRACT_LE_8BITS (cimp->ci_services);
                  info     = EXTRACT_LE_8BITS (cimp->ci_info);
                  segsize  = EXTRACT_LE_16BITS (cimp->ci_segsize);

                  switch (services & COS_MASK)
                  {
                    case COS_NONE:
                         break;
                    case COS_SEGMENT:
                         PUTS ("seg ");
                         break;
                    case COS_MESSAGE:
                         PUTS ("msg ");
                         break;
                    case COS_CRYPTSER:
                         PUTS ("crypt ");
                         break;
                  }
                  switch (info & COI_MASK)
                  {
                    case COI_32:
                         PUTS ("ver 3.2 ");
                         break;
                    case COI_31:
                         PUTS ("ver 3.1 ");
                         break;
                    case COI_40:
                         PUTS ("ver 4.0 ");
                         break;
                    case COI_41:
                         PUTS ("ver 4.1 ");
                         break;
                  }
                  PRINTF ("segsize %d ", segsize);
#ifdef PRINT_DECNET_DETAILS
                  dp = (u_char *) &nspp[sizeof(struct cimsg)];
                  pdata (dp, nsplen - sizeof(struct cimsg));
#endif
                }
                break;

           case MFS_CC:
                PRINTF ("conn-confirm %d>%d ", src, dst);
                {
                  struct ccmsg *ccmp = (struct ccmsg *) nspp;
                  int    services, info;
                  u_int  segsize, optlen;
                  u_char *dp;

                  services = EXTRACT_LE_8BITS (ccmp->cc_services);
                  info = EXTRACT_LE_8BITS (ccmp->cc_info);
                  segsize = EXTRACT_LE_16BITS (ccmp->cc_segsize);
                  optlen = EXTRACT_LE_8BITS (ccmp->cc_optlen);

                  switch (services & COS_MASK)
                  {
                    case COS_NONE:
                         break;
                    case COS_SEGMENT:
                         PUTS ("seg ");
                         break;
                    case COS_MESSAGE:
                         PUTS ("msg ");
                         break;
                    case COS_CRYPTSER:
                         PUTS ("crypt ");
                         break;
                  }
                  switch (info & COI_MASK)
                  {
                    case COI_32:
                         PUTS ("ver 3.2 ");
                         break;
                    case COI_31:
                         PUTS ("ver 3.1 ");
                         break;
                    case COI_40:
                         PUTS ("ver 4.0 ");
                         break;
                    case COI_41:
                         PUTS ("ver 4.1 ");
                         break;
                  }
                  PRINTF ("segsize %d ", segsize);
                  if (optlen)
                  {
                    PRINTF ("optlen %d ", optlen);
#ifdef PRINT_DECNET_DETAILS
                    optlen = min (optlen, nsplen - sizeof(struct ccmsg));
                    dp = (u_char *) &nspp[sizeof(struct ccmsg)];
                    pdata (dp, optlen);
#endif
                  }
                }
                break;

           case MFS_DI:
                PRINTF ("disconn-initiate %d>%d ", src, dst);
                {
                  struct dimsg *dimp = (struct dimsg *) nspp;
                  int    reason;
                  u_int  optlen;
                  u_char *dp;

                  reason = EXTRACT_LE_16BITS (dimp->di_reason);
                  optlen = EXTRACT_LE_8BITS (dimp->di_optlen);

                  print_reason (reason);
                  if (optlen)
                  {
                    PRINTF ("optlen %d ", optlen);
#ifdef PRINT_DECNET_DETAILS
                    optlen = min (optlen, nsplen - sizeof(struct dimsg));
                    dp = (u_char *) &nspp[sizeof(struct dimsg)];
                    pdata (dp, optlen);
#endif
                  }
                }
                break;

           case MFS_DC:
                PRINTF ("disconn-confirm %d>%d ", src, dst);
                {
                  struct dcmsg *dcmp = (struct dcmsg *) nspp;
                  int    reason = EXTRACT_LE_16BITS (dcmp->dc_reason);
                  print_reason (reason);
                }
                break;

           default:
                PRINTF ("reserved-ctltype? %x %d > %d", flags, src, dst);
                break;
         }
         break;

    default:
         PRINTF ("reserved-type? %x %d > %d", flags, src, dst);
         break;
  }
}

static struct tok reason2str[] = {
       { UC_OBJREJECT,    "object rejected connect"},
       { UC_RESOURCES,    "insufficient resources"},
       { UC_NOSUCHNODE,   "unrecognized node name"},
       { DI_SHUT,         "node is shutting down"},
       { UC_NOSUCHOBJ,    "unrecognized object"},
       { UC_INVOBJFORMAT, "invalid object name format"},
       { UC_OBJTOOBUSY,   "object too busy"},
       { DI_PROTOCOL,     "protocol error discovered"},
       { DI_TPA,          "third party abort"},
       { UC_USERABORT,    "user abort"},
       { UC_INVNODEFORMAT,"invalid node name format"},
       { UC_LOCALSHUT,    "local node shutting down"},
       { DI_LOCALRESRC,   "insufficient local resources"},
       { DI_REMUSERRESRC, "insufficient remote user resources"},
       { UC_ACCESSREJECT, "invalid access control information"},
       { DI_BADACCNT,     "bad ACCOUNT information"},
       { UC_NORESPONSE,   "no response from object"},
       { UC_UNREACHABLE,  "node unreachable"},
       { DC_NOLINK,       "no link terminate"},
       { DC_COMPLETE,     "disconnect complete"},
       { DI_BADIMAGE,     "bad image data in connect"},
       { DI_SERVMISMATCH, "cryptographic service mismatch"},
       { 0, NULL}
     };

static void print_reason (int reason)
{
  PRINTF ("%s ", tok2str(reason2str,"reason-%d",reason));
}

char *dnnum_string (u_short dnaddr)
{
  int  area = (dnaddr & AREAMASK) >> AREASHIFT;
  int  node = dnaddr & NODEMASK;
  char *str = malloc (sizeof("00.0000"));

  if (!str)
     PERROR (("dnnum_string: malloc"));
  sprintf (str, "%d.%d", area, node);
  return (str);
}

char *dnname_string (u_short dnaddr)
{
  return dnnum_string (dnaddr);
}

⌨️ 快捷键说明

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