/* WARNING: Removing unreachable block (ram,0x0040a960) */
/* WARNING: Removing unreachable block (ram,0x0040a990) */
/* WARNING: Heritage AFTER dead removal. Example location: r0x0041f008 : 0x0040a904 */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* WARNING: Restarted to delay deadcode elimination for space: ram */

void qosrcvpkt(void)

{
  undefined1 uVar1;
  undefined1 uVar2;
  undefined1 uVar3;
  undefined1 uVar4;
  undefined1 uVar5;
  undefined1 uVar6;
  undefined1 uVar7;
  short sVar8;
  longlong lVar9;
  int iVar10;
  ushort *puVar11;
  int iVar12;
  int iVar13;
  ushort uVar14;
  int iVar15;
  undefined4 *puVar16;
  uint uVar17;
  char *pcVar18;
  uint uVar19;
  uint uVar20;
  uint uVar21;
  undefined1 *puVar22;
  short *psVar23;
  int iVar24;
  code *pcVar25;
  timeval local_34;
  
  uVar19 = g_opcode;
  if (10 < g_opcode) {
    pcVar25 = warn;
    pcVar18 = "qospktrcv: g_opcode=%d is out of range for QoS msg; ignoring\n";
    goto LAB_0040af10;
  }
  sVar8 = CONCAT11(g_base_hdr[0x10],g_base_hdr[0x11])   //possible issue identified - semgrep
  if (g_opcode != 10) {
    if (sVar8 == 0) {
      pcVar25 = warn;
      pcVar18 = "qospktrcv: g_opcode=%d must be sequenced; ignoring\n";
    }
    else {
      if (((g_base_hdr[4] == g_hwaddr) && (g_base_hdr[5] == DAT_0041f029)) &&
         ((g_base_hdr[6] == DAT_0041f02a &&
          (((g_base_hdr[7] == DAT_0041f02b && (g_base_hdr[8] == DAT_0041f02c)) &&
           (g_base_hdr[9] == DAT_0041f02d)))))) goto LAB_0040a0ec;
      pcVar25 = warn;
      pcVar18 = "qospktrcv: g_opcode=%d must be directed; ignoring\n";
    }
    goto LAB_0040af10;
  }
  if (sVar8 != 0) {
    pcVar18 = "qospktrcv: QosCounterLease must not be sequenced; ignoring\n";
LAB_0040a0dc:
    warn(pcVar18);
    return;
  }
  if ((((g_base_hdr[4] != -1) || (g_base_hdr[5] != -1)) || (g_base_hdr[6] != -1)) ||
     (((g_base_hdr[7] != -1 || (g_base_hdr[8] != -1)) || (g_base_hdr[9] != -1)))) {
    pcVar18 = "qospktrcv: QosCounterLease must be broadcasted; ignoring\n";
    goto LAB_0040a0dc;
  }
LAB_0040a0ec:
  if (g_ethernet_hdr[6] != g_base_hdr[10]) {
    return;
  }
  if (g_ethernet_hdr[7] != g_base_hdr[0xb]) {
    return;
  }
  if (g_ethernet_hdr[8] != g_base_hdr[0xc]) {
    return;
  }
  if (g_ethernet_hdr[9] != g_base_hdr[0xd]) {
    return;
  }
  if (g_ethernet_hdr[10] != g_base_hdr[0xe]) {
    return;
  }
  if (g_ethernet_hdr[0xb] != g_base_hdr[0xf]) {
    return;
  }
  if (*g_ethernet_hdr != g_base_hdr[4]) {
    return;
  }
  if (g_ethernet_hdr[1] != g_base_hdr[5]) {
    return;
  }
  if (g_ethernet_hdr[2] != g_base_hdr[6]) {
    return;
  }
  if (g_ethernet_hdr[3] != g_base_hdr[7]) {
    return;
  }
  if (g_ethernet_hdr[4] != g_base_hdr[8]) {
    return;
  }
  if (g_ethernet_hdr[5] != g_base_hdr[9]) {
    return;
  }
  g_qinit_hdr = (ushort *)(g_base_hdr + 0x12);
  g_snap_hdr = g_qinit_hdr;
  g_qprb_hdr = g_qinit_hdr;
  g_sequencenum = sVar8;
  switch(g_opcode) {
  case 0:
    if (g_rcvd_pkt_len < 0x21) {
      warn("qos_initsink: frame with truncated InitializeSink header (len=%d src=%02x:%02x:%02x:%02x:%02x:%02x dst=%02x:%02x:%02x:%02x:%02x:%02x); ignoring\n"
           ,g_rcvd_pkt_len,g_ethernet_hdr[6],g_ethernet_hdr[7],g_ethernet_hdr[8],g_ethernet_hdr[9],
           g_ethernet_hdr[10],g_ethernet_hdr[0xb],*g_ethernet_hdr,g_ethernet_hdr[1],
           g_ethernet_hdr[2],g_ethernet_hdr[3],g_ethernet_hdr[4],g_ethernet_hdr[5]);
      return;
    }
    if ((char)*g_qinit_hdr == -1) {
      puVar16 = (undefined4 *)FUN_00409b80();
      if (puVar16 != (undefined4 *)0x0) {
LAB_0040ad8c:
        puVar22 = g_base_hdr + 10;
        puVar16[0x48b] = 1;
        memcpy((void *)((int)puVar16 + 0x1226),puVar22,6)   //possible issue identified - semgrep
        sVar8 = g_sequencenum;
        *puVar16 = 4;
        fmt_base(g_txbuf,&g_hwaddr,(void *)((int)puVar16 + 0x1226),2,1,sVar8,0);
        g_reorder_buffer =
             g_LinkSpeed << 0x18 | g_LinkSpeed >> 0x18 | g_LinkSpeed >> 8 & 0xff00 |
             (g_LinkSpeed & 0xff00) << 8;
        memcpy(g_txbuf + 0x20,&g_reorder_buffer,4)   //possible issue identified - semgrep
        cpy_hton64(0x41f190,&g_TimeStampFreq);
        pcVar25 = tx_write;
        uVar19 = 0x2c;
        pcVar18 = g_txbuf;
        break;
      }
      puVar16 = &g_QosSessions;
      iVar15 = 0;
      do {
        iVar15 = iVar15 + 1;
        if (puVar16[0x48b] == 0) goto LAB_0040ad8c;
        puVar16 = puVar16 + 0x48c;
      } while (iVar15 != 10);
      fmt_base(g_txbuf,&g_hwaddr,g_base_hdr + 10,2,6,g_sequencenum,0);
      g_txbuf[0x21] = 1;
    }
    else {
      fmt_base(g_txbuf,&g_hwaddr,g_base_hdr + 10,2,6,sVar8,0);
      g_txbuf[0x21] = 2;
    }
    pcVar25 = tx_write;
    uVar19 = 0x22;
    g_txbuf[0x20] = 0;
    pcVar18 = g_txbuf;
    break;
  default:
    goto switchD_0040a24c_caseD_1;
  case 2:
    ioctl(*(int *)(g_osl + 8),0x8906,&local_34);
    _g_pktio_timestamp = (longlong)local_34.tv_sec * 1000000 + (longlong)local_34.tv_usec;
    puVar16 = (undefined4 *)FUN_00409b80();
    puVar11 = g_qprb_hdr;
    if (puVar16 == (undefined4 *)0x0) {
      return;
    }
    *puVar16 = 4;
    if ((char)puVar11[0xc] != '\x01') {
      if ((char)puVar11[0xc] != '\0') {
        return;
      }
      uVar19 = (uint)*(byte *)(puVar16 + 1);
      uVar20 = (uint)*(byte *)((int)puVar16 + 5);
      uVar17 = uVar19;
      do {
        if (uVar20 + uVar19 <= uVar17) {
          if (uVar20 < 8) {
            uVar19 = uVar20 + uVar19 & 7;
            *(byte *)((int)puVar16 + 5) = *(byte *)((int)puVar16 + 5) + 1;
          }
          else {
            *(byte *)(puVar16 + 1) = *(byte *)(puVar16 + 1) + 1 & 7;
          }
          sVar8 = g_sequencenum;
          psVar23 = (short *)((int)puVar16 + uVar19 * 0x244 + 6);
          *(undefined2 *)(puVar16 + uVar19 * 0x91 + 2) = 0;
          *psVar23 = sVar8;
LAB_0040a6c4:
          puVar11 = g_qprb_hdr;
          uVar14 = psVar23[1];
          psVar23[1] = uVar14 + 1;
          memcpy(psVar23 + (uint)uVar14 * 9 + 2,puVar11,8)   //possible issue identified - semgrep
          cpy_hton64(psVar23 + (uint)uVar14 * 9 + 6,&g_pktio_timestamp);
          uVar1 = *(undefined1 *)((int)g_qprb_hdr + 0x19);
          *(undefined1 *)((int)psVar23 + (uint)uVar14 * 0x12 + 0x15) = 0;
          *(undefined1 *)(psVar23 + (uint)uVar14 * 9 + 10) = uVar1;
          return;
        }
        uVar21 = uVar17 & 7;
        psVar23 = (short *)((int)puVar16 + uVar21 * 0x244 + 6);
        if (*(short *)((int)puVar16 + uVar21 * 0x244 + 6) == g_sequencenum) {
          if (0x1f < *(ushort *)(puVar16 + uVar21 * 0x91 + 2)) {
            return;
          }
          goto LAB_0040a6c4;
        }
        uVar17 = uVar17 + 1;
      } while( true );
    }
    if ((char)puVar11[0xd] < '\0') {
      memcpy(g_txbuf,g_base_hdr + 10,6)   //possible issue identified - semgrep
      memcpy(g_txbuf + 6,g_base_hdr + 4,6)   //possible issue identified - semgrep
      memcpy(g_txbuf + 0x16,g_base_hdr + 10,6)   //possible issue identified - semgrep
      memcpy(g_txbuf + 0x1c,g_base_hdr + 4,6)   //possible issue identified - semgrep
      g_txbuf[0xc] = 0x81;
      g_txbuf[0xd] = 0;
      g_txbuf[0xe] = (undefined1)(((byte)g_qprb_hdr[0xd] & 0x7f) << 1);
      g_txbuf[0xf] = 0;
      g_txbuf[0x11] = (undefined1)((ushort)*(undefined2 *)(g_ethernet_hdr + 0xc) >> 8);
      g_txbuf[0x10] = (undefined1)*(undefined2 *)(g_ethernet_hdr + 0xc);
      g_txbuf[0x12] = *g_base_hdr;
      g_txbuf[0x13] = g_base_hdr[1];
      g_txbuf[0x14] = g_base_hdr[2];
      g_txbuf[0x15] = g_base_hdr[3];
      g_txbuf[0x23] = (undefined1)((ushort)*(undefined2 *)(g_base_hdr + 0x10) >> 8);
      g_txbuf[0x22] = (undefined1)*(undefined2 *)(g_base_hdr + 0x10);
      g_txbuf._36_4_ = *(undefined4 *)g_qprb_hdr;
      g_txbuf._40_4_ = *(undefined4 *)(g_qprb_hdr + 2);
      g_txbuf[0x3e] = (undefined1)g_qprb_hdr[0xd];
      g_txbuf[0x3d] = *(undefined1 *)((int)g_qprb_hdr + 0x19);
      g_txbuf[0x3c] = 2;
      cpy_hton64(0x41f198,&g_pktio_timestamp);
      memcpy(g_txbuf + 0x3f,(void *)((int)g_qprb_hdr + 0x1b),
             (size_t)(g_txbuf + (g_rcvd_pkt_len - ((int)g_qprb_hdr + 0x1b))))   //possible issue identified - semgrep
      ioctl(*(int *)(g_osl + 8),0x8906,&local_34);
      _g_pktio_timestamp = (longlong)local_34.tv_sec * 1000000 + (longlong)local_34.tv_usec;
      cpy_hton64(0x41f1a0,&g_pktio_timestamp);
      pcVar25 = tx_write;
      uVar19 = g_rcvd_pkt_len + 4;
      pcVar18 = g_txbuf;
    }
    else {
      *(undefined1 *)(puVar11 + 0xc) = 2;
      memcpy(g_ethernet_hdr,g_base_hdr + 10,6)   //possible issue identified - semgrep
      memcpy(g_ethernet_hdr + 6,g_base_hdr + 4,6)   //possible issue identified - semgrep
      memcpy(g_base_hdr + 4,g_base_hdr + 10,6)   //possible issue identified - semgrep
      memcpy(g_base_hdr + 10,g_ethernet_hdr + 6,6)   //possible issue identified - semgrep
      cpy_hton64(g_qprb_hdr + 4,&g_pktio_timestamp);
      ioctl(*(int *)(g_osl + 8),0x8906,&local_34);
      _g_pktio_timestamp = (longlong)local_34.tv_sec * 1000000 + (longlong)local_34.tv_usec;
      cpy_hton64(g_qprb_hdr + 8,&g_pktio_timestamp);
      pcVar25 = tx_write;
      pcVar18 = &g_rxbuf;
      uVar19 = g_rcvd_pkt_len;
    }
    break;
  case 3:
    puVar16 = (undefined4 *)FUN_00409b80();
    sVar8 = g_sequencenum;
    if (puVar16 == (undefined4 *)0x0) {
      return;
    }
    *puVar16 = 4;
    fmt_base(g_txbuf,&g_hwaddr,(int)puVar16 + 0x1226,2,4,sVar8,0);
    uVar19 = (uint)*(byte *)(puVar16 + 1);
    uVar17 = *(byte *)((int)puVar16 + 5) + uVar19;
    for (; uVar20 = uVar19 & 7, uVar19 < uVar17; uVar19 = uVar19 + 1) {
      iVar15 = (int)puVar16 + uVar20 * 0x244 + 6;
      if (*(short *)((int)puVar16 + uVar20 * 0x244 + 6) == g_sequencenum) {
        uVar17 = (uint)*(ushort *)(puVar16 + uVar20 * 0x91 + 2);
        goto LAB_0040a7c8;
      }
    }
    uVar17 = 0;
    iVar15 = 0;
LAB_0040a7c8:
    uVar14 = (ushort)(uVar17 << 8) | (ushort)(uVar17 >> 8);
    g_short_reorder_buffer._1_1_ = (undefined1)uVar17;
    g_short_reorder_buffer._0_1_ = (undefined1)(uVar17 >> 8);
    uVar19 = 0x22;
    g_txbuf[0x21] = g_short_reorder_buffer._1_1_;
    g_txbuf[0x20] = (undefined1)g_short_reorder_buffer;
    g_short_reorder_buffer = uVar14;
    if (uVar17 != 0) {
      memcpy(g_txbuf + 0x22,(void *)(iVar15 + 4),uVar17 * 0x12)   //possible issue identified - semgrep
      uVar19 = uVar17 * 0x12 + 0x22;
    }
    pcVar25 = tx_write;
    pcVar18 = g_txbuf;
    break;
  case 5:
    puVar16 = (undefined4 *)FUN_00409b80();
    if (puVar16 == (undefined4 *)0x0) {
      warn("packetio_recv_handler: no session active for %02x:%02x:%02x:%02x:%02x:%02x; ignoring...\n"
           ,g_base_hdr[10],g_base_hdr[0xb],g_base_hdr[0xc],g_base_hdr[0xd],g_base_hdr[0xe],
           g_base_hdr[0xf]);
      return;
    }
    *(undefined1 *)((int)puVar16 + 5) = 0;
    sVar8 = g_sequencenum;
    puVar16[0x48b] = 0;
    *puVar16 = 0;
    fmt_base(g_txbuf,&g_hwaddr,(int)puVar16 + 0x1226,2,7,sVar8,0);
    uVar19 = 0x20;
    pcVar25 = tx_write;
    pcVar18 = g_txbuf;
    break;
  case 8:
    fmt_base(g_txbuf,&g_hwaddr,g_base_hdr + 10,2,9,sVar8,0);
    gettimeofday(&local_34,(__timezone_ptr_t)0x0);
    lVar9 = (longlong)local_34.tv_sec * 1000000 +
            CONCAT44(((local_34.tv_usec >> 0x1f) - DAT_0041f0d4) -
                     (uint)((uint)local_34.tv_usec < (uint)(local_34.tv_usec - g_perf_timestamp)),
                     local_34.tv_usec - g_perf_timestamp);
    uVar19 = (uint)lVar9;
    g_txbuf[0x20] =
         __udivdi3(uVar19 * 0x100,uVar19 >> 0x18 | (int)((ulonglong)lVar9 >> 0x20) * 0x100,1000000,0
                  );
    g_txbuf[0x22] = 0;
    g_txbuf[0x21] = 0;
    uVar19 = (uint)g_sample_count;
    if ((uint)*g_snap_hdr < (uint)g_sample_count) {
      uVar19 = (uint)*g_snap_hdr;
    }
    uVar20 = uVar19 & 0xff;
    uVar17 = (g_next_sample + 0x3c) - uVar20;
    puVar22 = g_txbuf + 0x24;
    g_txbuf[0x23] = (undefined1)uVar19;
    uVar19 = uVar20;
    while( true ) {
      iVar13 = g_rbytes;
      iVar12 = g_rpkts;
      iVar10 = g_tbytes;
      iVar15 = g_tpkts;
      uVar21 = uVar17 % 0x3c;
      uVar17 = uVar21 + 1;
      if (uVar19 == 0) break;
      iVar15 = uVar21 * 8;
      uVar1 = g_perf_samples[iVar15 + 2];
      uVar2 = g_perf_samples[iVar15 + 4];
      uVar3 = g_perf_samples[iVar15 + 6];
      uVar4 = g_perf_samples[iVar15 + 7];
      uVar5 = g_perf_samples[iVar15 + 1];
      uVar6 = g_perf_samples[iVar15 + 3];
      uVar7 = g_perf_samples[iVar15 + 5];
      puVar22[1] = g_perf_samples[iVar15];
      puVar22[3] = uVar1;
      puVar22[5] = uVar2;
      puVar22[7] = uVar3;
      *puVar22 = uVar5;
      puVar22[2] = uVar6;
      puVar22[4] = uVar7;
      puVar22[6] = uVar4;
      uVar19 = uVar19 - 1;
      puVar22 = puVar22 + 8;
    }
    iVar24 = uVar20 * 8;
    FUN_00409c58();
    uVar19 = g_rbytes - iVar13;
    if (g_rbytes == iVar13) {
      uVar19 = 0;
    }
    uVar19 = uVar19 >> 10 & 0xffff;
    g_txbuf[iVar24 + 0x25] = (char)uVar19;
    g_txbuf[iVar24 + 0x24] = (char)(uVar19 >> 8);
    uVar19 = g_rpkts - iVar12;
    if (g_rpkts == iVar12) {
      uVar19 = 0;
    }
    g_txbuf[iVar24 + 0x27] = (char)(uVar19 & 0xffff);
    g_txbuf[iVar24 + 0x26] = (char)((uVar19 & 0xffff) >> 8);
    uVar19 = g_tbytes - iVar10;
    if (g_tbytes == iVar10) {
      uVar19 = 0;
    }
    uVar19 = uVar19 >> 10 & 0xffff;
    g_txbuf[iVar24 + 0x29] = (char)uVar19;
    g_txbuf[iVar24 + 0x28] = (char)(uVar19 >> 8);
    uVar17 = g_tpkts - iVar15;
    if (g_tpkts == iVar15) {
      uVar17 = 0;
    }
    g_txbuf[iVar24 + 0x2b] = (char)(uVar17 & 0xffff);
    pcVar25 = tx_write;
    uVar19 = iVar24 + 0x2c;
    g_tpkts = iVar15;
    g_tbytes = iVar10;
    g_rpkts = iVar12;
    g_rbytes = iVar13;
    g_txbuf[iVar24 + 0x2a] = (char)((uVar17 & 0xffff) >> 8);
    pcVar18 = g_txbuf;
    break;
  case 10:
    if (g_samples_remaining == 0) {
      gettimeofday(&local_34,(__timezone_ptr_t)0x0);
      local_34.tv_sec = local_34.tv_sec + 1;
      g_qos_CTA_timer = event_add(&local_34,FUN_0040af4c,0);
    }
    g_samples_remaining = 300;
    goto switchD_0040a24c_caseD_1;
  }
LAB_0040af10:
  (*pcVar25)(pcVar18,uVar19);
switchD_0040a24c_caseD_1:
  return;
}