/* 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;
}