1

GTP トンネリング パケットを生成しています。形式は次のとおりです。

「外部 IP」 -> 「外部 UDP」 -> 「GTP」 -> 「内部 IP」 -> 「内部 UDP」

私が使用しているUDPチェックサムアルゴリズムは、実際にはDHCPdからのものです

**********************code snippet start **********************
udp_header->check = wrapsum(in_cksum((unsigned char *)udp_header, sizeof(struct udp_header),
                                       in_cksum((unsigned char *)&buffer[i], send_len-i,
                        in_cksum((unsigned char *)&ip_header->saddr,
                             2*sizeof(ip_header->saddr),
                             IPPROTO_UDP + ntohs(udp_header->len)))));

/* ******************************************* */

/*
 * Checksum routine for Internet Protocol family headers (C Version)
 *
 * Borrowed from DHCPd
 */

static u_int32_t in_cksum(unsigned char *buf,
              unsigned nbytes, u_int32_t sum) {
  uint i;

  /* Checksum all the pairs of bytes first... */
  for (i = 0; i < (nbytes & ~1U); i += 2) {
    sum += (u_int16_t) ntohs(*((u_int16_t *)(buf + i)));
    /* Add carry. */
    if(sum > 0xFFFF)
      sum -= 0xFFFF;
  }

  /* If there's a single byte left over, checksum it, too.   Network
     byte order is big-endian, so the remaining byte is the high byte. */
  if(i < nbytes) {
#ifdef DEBUG_CHECKSUM_VERBOSE
    debug ("sum = %x", sum);
#endif
    sum += buf [i] << 8;
    /* Add carry. */
    if(sum > 0xFFFF)
      sum -= 0xFFFF;
  }

  return sum;
}

/* ******************************************* */

static u_int32_t wrapsum (u_int32_t sum) {
  sum = ~sum & 0xFFFF;
  return htons(sum);
}


**********************code snippet end**********************

外部 UDP 呼び出しと内部 UDP 呼び出しの両方で、同じチェックサム関数が使用されます。ただし、内部 UDP は問題ありませんが、外部 UDP は Wireshark のチェックサム チェックに失敗しています。この問題に関する推奨事項はありますか?

4

0 に答える 0