int FUN_0040fb5c(undefined4 param_1,uint param_2,int param_3,uint *param_4)
{
undefined4 uVar1;
undefined4 uVar2;
int iVar3;
char *pcVar4;
uint uVar5;
uint local_40;
uint local_3c;
uint local_38;
uint local_34;
uint local_30;
uint local_2c;
uint local_28;
uVar5 = param_4[6];
local_40 = *param_4;
local_3c = param_4[1];
local_34 = param_4[3];
local_38 = param_4[2];
local_30 = param_4[4];
local_2c = param_4[5];
local_28 = uVar5;
if (uVar5 < 0x81) {
prefix6_mask(&local_38,uVar5);
if ((((param_4[2] != local_38) || (param_4[3] != local_34)) || (param_4[4] != local_30)) ||
(param_4[5] != local_2c)) {
uVar1 = in6addr2str(param_4 + 2,0);
uVar5 = param_4[6];
uVar2 = in6addr2str(&local_38,0);
dprintf(4,"add_prefix","prefix %s/%d for %s has a trailing garbage. It should be %s/%d",uVar1
,uVar5,param_2,uVar2,local_28);
}
if ((((char)local_38 != -1) && ((local_38 & 0xc0ff) != 0x80fe)) &&
((local_38 & 0xc0ff) != 0xc0fe)) {
iVar3 = dhcp6_find_listval(param_1,param_3,&local_40,0);
if (iVar3 == 0) {
if ((local_3c == 0xffffffff) || ((local_40 != 0xffffffff && (local_40 <= local_3c)))) {
iVar3 = dhcp6_add_listval(param_1,param_3,&local_40,0);
return -(uint)(iVar3 == 0);
}
if (param_3 != 5) {
uVar1 = in6addr2str(&local_38,0);
dprintf(5,"add_prefix","%s has larger preferred lifetime than valid lifetime",uVar1);
return -1;
}
uVar1 = in6addr2str(&local_38,0);
pcVar4 = "%s/%d has larger preferred lifetime than valid lifetime";
param_2 = local_28;
}
else if (param_3 == 5) {
uVar1 = in6addr2str(&local_38,0);
pcVar4 = "duplicated prefix: %s/%d for %s";
param_2 = local_28;
}
else {
uVar1 = in6addr2str(&local_38,0);
pcVar4 = "duplicated address: %s for %s";
}
dprintf(5,"add_prefix",pcVar4,uVar1,param_2);
return -1;
}
uVar5 = in6addr2str(&local_38,0);
pcVar4 = "invalid prefix address: %s";
}
else {
pcVar4 = "invalid prefix: %d";
}
dprintf(3,"add_prefix",pcVar4,uVar5);
return -1;
}