static uint8_t *dhcp_get_option(dhcp_packet_t *packet, size_t packet_size,
unsigned int option)
-
{
int overload = 0;
int field = DHCP_OPTION_FIELD;
return NULL;
}
#endif
-
+
fr_sockaddr2ipaddr(&dst, sizeof_dst, &packet->dst_ipaddr, &port);
packet->dst_port = port;
char type_buf[64];
const char *name = type_buf;
char src_ip_buf[256], dst_ip_buf[256];
-
+
if ((packet->code >= PW_DHCP_DISCOVER) &&
(packet->code <= PW_DHCP_INFORM)) {
name = dhcp_message_types[packet->code - PW_DHCP_OFFSET];
}
memcpy(tlv->vp_tlv, data, data_len);
tlv->length = data_len;
-
+
return 0;
}
if (alen != 1) goto raw;
vp->vp_integer = p[0];
break;
-
+
case PW_TYPE_SHORT:
if (alen != 2) goto raw;
- vp->vp_integer = (p[0] << 8) | p[1];
+ memcpy(&vp->vp_integer, p, 2);
+ vp->vp_integer = ntohs(vp->vp_integer);
break;
-
+
case PW_TYPE_INTEGER:
if (alen != 4) goto raw;
memcpy(&vp->vp_integer, p, 4);
vp->vp_integer = ntohl(vp->vp_integer);
break;
-
+
case PW_TYPE_IPADDR:
if (alen != 4) goto raw;
+ /*
+ * Keep value in Network Order!
+ */
memcpy(&vp->vp_ipaddr, p , 4);
vp->length = 4;
break;
-
+
case PW_TYPE_STRING:
if (alen > 253) return -1;
memcpy(vp->vp_strvalue, p , alen);
if (alen > 253) return -1;
memcpy(vp->vp_octets, p, alen);
break;
-
+
case PW_TYPE_TLV:
return decode_tlv(vp, p, alen);
-
+
default:
fr_strerror_printf("Internal sanity check %d %d", vp->da->type, __LINE__);
return -1;
pairfree(head);
return -1;
}
-
+
/*
* Hack for ease of use.
*/
head = NULL;
tail = &head;
p = packet->data;
-
+
if ((fr_debug_flag > 2) && fr_log_fp) {
for (i = 0; i < packet->data_len; i++) {
if ((i & 0x0f) == 0x00) fprintf(fr_log_fp, "%d: ", (int) i);
vp->vp_integer = p[0];
vp->length = 1;
break;
-
+
case PW_TYPE_SHORT:
vp->vp_integer = (p[0] << 8) | p[1];
vp->length = 2;
break;
-
+
case PW_TYPE_INTEGER:
memcpy(&vp->vp_integer, p, 4);
vp->vp_integer = ntohl(vp->vp_integer);
vp->length = 4;
break;
-
+
case PW_TYPE_IPADDR:
memcpy(&vp->vp_ipaddr, p, 4);
vp->length = 4;
break;
-
+
case PW_TYPE_STRING:
memcpy(vp->vp_strvalue, p, dhcp_header_sizes[i]);
vp->vp_strvalue[dhcp_header_sizes[i]] = '\0';
pairfree(&vp);
}
break;
-
+
case PW_TYPE_OCTETS:
memcpy(vp->vp_octets, p, packet->data[2]);
vp->length = packet->data[2];
break;
-
+
case PW_TYPE_ETHERNET:
memcpy(vp->vp_ether, p, sizeof(vp->vp_ether));
vp->length = sizeof(vp->vp_ether);
break;
-
+
default:
fr_strerror_printf("BAD TYPE %d", vp->da->type);
pairfree(&vp);
p += dhcp_header_sizes[i];
if (!vp) continue;
-
+
debug_pair(vp);
*tail = vp;
tail = &vp->next;
}
-
+
/*
* Loop over the options.
*/
if (fr_debug_flag > 0) {
for (vp = packet->vps; vp != NULL; vp = vp->next) {
-
+ /* Print debug output here? */
}
}
length = 1;
*p = vp->vp_integer & 0xff;
break;
-
+
case PW_TYPE_SHORT:
length = 2;
p[0] = (vp->vp_integer >> 8) & 0xff;
p[1] = vp->vp_integer & 0xff;
break;
-
+
case PW_TYPE_INTEGER:
length = 4;
lvalue = htonl(vp->vp_integer);
memcpy(p, &lvalue, 4);
break;
-
+
case PW_TYPE_IPADDR:
length = 4;
memcpy(p, &vp->vp_ipaddr, 4);
break;
-
+
case PW_TYPE_ETHERNET:
length = 6;
memcpy(p, &vp->vp_ether, 6);
break;
-
+
case PW_TYPE_STRING:
memcpy(p, vp->vp_strvalue, vp->length);
length = vp->length;
break;
-
+
case PW_TYPE_TLV: /* FIXME: split it on 255? */
memcpy(p, vp->vp_tlv, vp->length);
length = vp->length;
memcpy(p, vp->vp_octets, vp->length);
length = vp->length;
break;
-
+
default:
fr_strerror_printf("BAD TYPE2 %d", vp->da->type);
length = 0;
vp->vp_integer = p[0];
vp->length = 1;
break;
-
+
case PW_TYPE_SHORT:
vp->vp_integer = (p[0] << 8) | p[1];
vp->length = 2;
break;
-
+
case PW_TYPE_INTEGER:
memcpy(&vp->vp_integer, p, 4);
vp->vp_integer = ntohl(vp->vp_integer);
vp->length = 4;
break;
-
+
case PW_TYPE_IPADDR:
memcpy(&vp->vp_ipaddr, p, 4);
vp->length = 4;
break;
-
+
case PW_TYPE_STRING:
memcpy(vp->vp_strvalue, p, dhcp_header_sizes[i]);
vp->vp_strvalue[dhcp_header_sizes[i]] = '\0';
vp->length = strlen(vp->vp_strvalue);
break;
-
+
case PW_TYPE_OCTETS: /* only for Client HW Address */
memcpy(vp->vp_octets, p, packet->data[2]);
vp->length = packet->data[2];
break;
-
+
case PW_TYPE_ETHERNET: /* only for Client HW Address */
memcpy(vp->vp_ether, p, sizeof(vp->vp_ether));
vp->length = sizeof(vp->vp_ether);
break;
-
+
default:
fr_strerror_printf("Internal sanity check failed %d %d", vp->da->type, __LINE__);
pairfree(&vp);
break;
}
-
+
p += dhcp_header_sizes[i];
debug_pair(vp);
VALUE_PAIR **array, **last;
array = malloc(num_vps * sizeof(VALUE_PAIR *));
-
+
i = 0;
for (vp = packet->vps; vp != NULL; vp = vp->next) {
array[i++] = vp;
}
-
+
/*
* Sort the attributes.
*/
qsort(array, (size_t) num_vps, sizeof(VALUE_PAIR *),
attr_cmp);
-
+
last = &packet->vps;
for (i = 0; i < num_vps; i++) {
*last = array[i];
fr_strerror_printf("WARNING Ignoring too long attribute %s!", vp->da->name);
break;
}
-
+
*plength += length;
p += length;