首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OSPF中计算LSA校验和

在OSPF中计算LSA校验和
EN

Stack Overflow用户
提问于 2015-05-25 20:36:49
回答 1查看 598关注 0票数 1

我一直在尝试计算OSPF数据包的LSA校验和,但没有成功。

我阅读了ospf的RFC,并在那里告诉您需要使用Fletcher算法。我试过了,但还是没有给出正确的答案。我的代码:

代码语言:javascript
复制
Void calccksum(lsaHeader* lsa)
{
  lsa->checksum = 0;
  unsigned short answer = 0;
  unsigned char* ptr = (unsigned char*) lsa;
  int len = ntohs(lsa->len);

  // skip the age field
  ptr += 2;
  len -= 2;

  unsigned short sum1 = 0;
  unsigned short sum2 = 0;

  for (int i=0; i<len; i++)
  {
     sum1 += *ptr;
     if (sum1 >= 255)
        sum1 -= 255;
     sum2 += sum1;
     if (sum2 >= 255)
        sum2 -= 255;
     ptr++;
    }
   answer = (sum2 << 8) | sum1;
   lsa->checksum = ntohs(answer);
}

希望能得到一些帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-10-17 15:32:25

代码语言:javascript
复制
void calccksum(lsaHeader* lsa)
{
   unsigned char* data  = (unsigned char*) lsa;
   unsigned short bytes = ntohs(lsa->len);
   unsigned short sum1  = 0xff, sum2 = 0xff;

   /* RFC : The Fletcher checksum of the complete contents of the LSA,
    *       including the LSA header but excluding the LS age field.
    */
   data += 2; bytes -= 2;

   lsa->checksum = 0;
   while (bytes) {
       size_t len = bytes > 20 ? 20 : bytes;
       bytes -= len;
       do {
           sum2 += sum1 += *data++;
       } while (--len);
       sum1 = (sum1 & 0xff) + (sum1 >> 8);
       sum2 = (sum2 & 0xff) + (sum2 >> 8);
   }
   sum1 = (sum1 & 0xff) + (sum1 >> 8);
   sum2 = (sum2 & 0xff) + (sum2 >> 8);
   lsa->checksum = htons(sum2 << 8 | sum1);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30438574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档