void client6_send(int param_1)
{
int iVar1;
uint uVar2;
socklen_t __addr_len;
ssize_t sVar3;
undefined4 uVar4;
undefined4 uVar5;
int iVar6;
char *pcVar7;
int *piVar8;
int iVar9;
timeval local_1148;
sockaddr local_1140;
undefined4 local_1130;
undefined4 local_112c;
undefined4 local_1128;
undefined1 auStack_1120 [8];
undefined1 auStack_1118 [8];
undefined4 local_1110;
int local_1104;
undefined1 auStack_10f8 [8];
undefined1 auStack_10f0 [8];
undefined1 auStack_10e8 [144];
uint local_1058;
int local_1054;
int local_1050;
int local_104c;
undefined1 auStack_1048 [8];
undefined4 local_1040;
size_t local_103c;
void *local_1038;
int local_1034;
uint local_1028;
undefined1 auStack_1024 [4092];
local_1028 = 0;
iVar9 = *(int *)(param_1 + 8);
switch(*(undefined4 *)(param_1 + 0x3c)) {
default:
dprintf(3,"client6_send","unexpected state");
LAB_00402b98:
/* WARNING: Subroutine does not return */
exit(1);
case 1:
local_1028 = 1;
break;
case 2:
local_1028 = 0xb;
break;
case 3:
local_1028 = 3;
break;
case 4:
local_1028 = 5;
iVar1 = *(int *)(param_1 + 0x34);
goto joined_r0x00402e04;
case 5:
local_1028 = 6;
break;
case 6:
local_1028 = 8;
break;
case 8:
local_1028 = 4;
break;
case 9:
local_1028 = 9;
}
iVar1 = *(int *)(param_1 + 0x34);
joined_r0x00402e04:
if (iVar1 == 0) {
uVar2 = arc4random();
*(uint *)(param_1 + 0x38) = uVar2 & 0xffffff;
dprintf(7,"client6_send","a new XID (%x) is generated",uVar2 & 0xffffff);
}
uVar2 = *(uint *)(param_1 + 0x38);
local_1028 = uVar2 >> 0x18 | local_1028 & 0xff | uVar2 << 0x18 | uVar2 >> 8 & 0xff00 |
(uVar2 & 0xff00) << 8;
dhcp6_init_options(auStack_1120);
if (((*(uint *)(param_1 + 0x3c) < 10) && ((1 << (*(uint *)(param_1 + 0x3c) & 0x1f) & 600U) != 0))
&& (iVar1 = duidcpy(auStack_1118,param_1 + 0x10), iVar1 != 0)) {
dprintf(3,"client6_send","failed to copy server ID");
goto LAB_00402f94;
}
iVar1 = duidcpy(auStack_1120,&DAT_0043e9f4);
if (iVar1 != 0) {
dprintf(3,"client6_send","failed to copy client ID");
goto LAB_00402f94;
}
if ((*(int *)(param_1 + 0x3c) == 1) && ((*(uint *)(iVar9 + 0x2c) & 2) != 0)) {
local_1110 = 1;
}
if (*(int *)(param_1 + 0x34) == 0) {
gettimeofday((timeval *)(param_1 + 0x18),(__timezone_ptr_t)0x0);
local_1104 = 0;
}
else {
gettimeofday(&local_1148,(__timezone_ptr_t)0x0);
iVar1 = *(int *)(param_1 + 0x18);
if (local_1148.tv_sec < iVar1) {
LAB_00402ff4:
local_1104 = 0;
}
else {
if (local_1148.tv_sec == iVar1) {
iVar6 = *(int *)(param_1 + 0x1c);
iVar1 = 0;
if (local_1148.tv_usec < iVar6) goto LAB_00402ff4;
LAB_00403058:
iVar6 = local_1148.tv_usec - iVar6;
}
else {
iVar6 = *(int *)(param_1 + 0x1c);
iVar1 = local_1148.tv_sec - iVar1;
if (iVar6 <= local_1148.tv_usec) goto LAB_00403058;
iVar6 = (local_1148.tv_usec + 1000000) - iVar6;
iVar1 = iVar1 + -1;
}
local_1104 = 0xffff;
if ((iVar1 < 0x290) && (local_1104 = iVar6 / 10000 + iVar1 * 100, 0xfffe < local_1104)) {
local_1104 = 0xffff;
}
}
}
if ((*(int *)(param_1 + 0x3c) != 6) &&
(iVar1 = dhcp6_copy_list(auStack_10e8,iVar9 + 0x48), iVar1 != 0)) {
dprintf(3,"client6_send","failed to copy requested options");
goto LAB_00402f94;
}
piVar8 = *(int **)(param_1 + 0x4c);
if (piVar8 != (int *)0x0) {
do {
if (piVar8[3] == 0) {
iVar1 = dhcp6_copy_list(auStack_10f8,piVar8[4]);
}
else {
if (piVar8[3] != 1) {
dprintf(3,"client6_send","unexpected event data (%d)");
goto LAB_00402b98;
}
iVar1 = dhcp6_copy_list(auStack_10f0,piVar8[4]);
}
if (iVar1 != 0) {
dprintf(5,"client6_send","failed to add an IAPD");
goto LAB_00402f94;
}
piVar8 = (int *)*piVar8;
} while (piVar8 != (int *)0x0);
}
piVar8 = *(int **)(param_1 + 0x48);
if (piVar8 != (int *)0x0) {
local_1054 = *piVar8;
local_1050 = piVar8[1];
local_104c = piVar8[2];
if (*piVar8 != -1) {
if (*piVar8 == 2) {
if (*(int *)(param_1 + 0x3c) == 2) {
dprintf(4,"set_auth","delayed authentication cannot be used for Information-request yet");
}
else {
if (*(int *)(param_1 + 0x3c) == 1) {
local_1058 = local_1058 | 1;
goto LAB_00403118;
}
if (piVar8[3] == 0) {
uVar4 = dhcp6_event_statestr(param_1);
dprintf(6,"set_auth","no authentication key for %s",uVar4);
}
else {
iVar1 = dhcp6_validate_key();
if (iVar1 == 0) {
iVar1 = get_rdvalue(local_104c,auStack_1048,8);
if (iVar1 == 0) {
local_1040 = *(undefined4 *)(piVar8[3] + 0x10);
local_103c = *(size_t *)(piVar8[3] + 0xc) //possible issue identified - semgrep
local_1038 = malloc(local_103c) //possible issue identified - semgrep
if (local_1038 != (void *)0x0) {
memcpy(local_1038,*(void **)(piVar8[3] + 8),local_103c) //possible issue identified - semgrep
goto LAB_00403118;
}
dprintf(3,"set_auth","failed to allocate memory for authentication realm");
}
else {
dprintf(3,"set_auth","failed to get a replay detection value");
}
}
else {
dprintf(6,"set_auth","key %s is invalid",*(undefined4 *)(piVar8[3] + 4));
}
}
}
}
else {
dprintf(3,"set_auth","unsupported authentication protocol %d");
}
dprintf(6,"client6_send","failed to set authentication option");
goto LAB_00402f94;
}
}
LAB_00403118:
iVar1 = dhcp6_set_options(local_1028 & 0xff,auStack_1024,&stack0xffffffd8,auStack_1120);
if (iVar1 < 0) {
dprintf(6,"client6_send","failed to construct options");
}
else {
piVar8 = *(int **)(param_1 + 0x48);
if ((((piVar8 == (int *)0x0) || (*piVar8 != 2)) || (piVar8[3] == 0)) ||
(iVar6 = dhcp6_calc_mac(&local_1028,iVar1 + 4U,local_1054,local_1050,local_1034 + 4,piVar8[3]
), iVar6 == 0)) {
local_1140._0_4_ = *DAT_0043e9f0;
local_1140.sa_data._2_4_ = DAT_0043e9f0[1];
local_1140.sa_data._6_4_ = DAT_0043e9f0[2];
local_1140.sa_data._10_4_ = DAT_0043e9f0[3];
local_1130 = DAT_0043e9f0[4];
local_112c = DAT_0043e9f0[5];
local_1128 = *(undefined4 *)(iVar9 + 0x18);
if (local_1140.sa_family == 10) {
__addr_len = 0x1c;
}
else {
__addr_len = 0x10;
}
sVar3 = sendto(sock,&local_1028,iVar1 + 4U,0,&local_1140,__addr_len);
if (sVar3 == -1) {
piVar8 = __errno_location();
pcVar7 = strerror(*piVar8);
dprintf(3,"client6_send","transmit failed: %s",pcVar7);
uVar4 = dhcp6msgstr(local_1028 & 0xff);
uVar5 = addr2str(&local_1140);
pcVar7 = "send %s to %s error";
}
else {
uVar4 = dhcp6msgstr(local_1028 & 0xff);
uVar5 = addr2str(&local_1140);
pcVar7 = "send %s to %s";
}
dprintf(7,"client6_send",pcVar7,uVar4,uVar5);
}
else {
dprintf(4,"client6_send","failed to calculate MAC");
}
}
LAB_00402f94:
dhcp6_clear_options(auStack_1120);
return;
}