#include "DHCPv6.h"
#include "DHCPv6Options.h"
#include <stddef.h>
#include "util.h"
#include "cfutil.h"
#include <SystemConfiguration/SCPrivate.h>
const char *
DHCPv6MessageName(int message)
{
const char * str;
switch (message) {
case kDHCPv6MessageNone:
str = "None";
break;
case kDHCPv6MessageSOLICIT:
str = "SOLICIT";
break;
case kDHCPv6MessageADVERTISE:
str = "ADVERTISE";
break;
case kDHCPv6MessageREQUEST:
str = "REQUEST";
break;
case kDHCPv6MessageCONFIRM:
str = "CONFIRM";
break;
case kDHCPv6MessageRENEW:
str = "RENEW";
break;
case kDHCPv6MessageREBIND:
str = "REBIND";
break;
case kDHCPv6MessageREPLY:
str = "REPLY";
break;
case kDHCPv6MessageRELEASE:
str = "RELEASE";
break;
case kDHCPv6MessageDECLINE:
str = "DECLINE";
break;
case kDHCPv6MessageRECONFIGURE:
str = "RECONFIGURE";
break;
case kDHCPv6MessageINFORMATION_REQUEST:
str = "INFORMATION_REQUEST";
break;
case kDHCPv6MessageRELAY_FORW:
str = "RELAY_FORW";
break;
case kDHCPv6MessageRELAY_REPL:
str = "RELAY_REPL";
break;
default:
str = "<unknown";
break;
}
return (str);
}
void
DHCPv6PacketSetMessageType(DHCPv6PacketRef pkt, int msg_type)
{
pkt->msg_type = msg_type;
return;
}
void
DHCPv6PacketSetTransactionID(DHCPv6PacketRef pkt, uint32_t transaction_id)
{
uint32_t r = htonl(transaction_id);
uint8_t * v;
v = (uint8_t *)&r;
pkt->transaction_id[0] = v[1];
pkt->transaction_id[1] = v[2];
pkt->transaction_id[2] = v[3];
return;
}
uint32_t
DHCPv6PacketGetTransactionID(const DHCPv6PacketRef pkt)
{
uint32_t r;
uint8_t * v;
v = (uint8_t *)&r;
v[0] = 0;
v[1] = pkt->transaction_id[0];
v[2] = pkt->transaction_id[1];
v[3] = pkt->transaction_id[2];
return (ntohl(r));
}
void
DHCPv6PacketPrintToString(CFMutableStringRef str,
const DHCPv6PacketRef pkt, int pkt_len)
{
if (pkt_len < DHCPV6_PACKET_HEADER_LENGTH) {
STRING_APPEND(str, "Packet too short %d < %d\n",
pkt_len, DHCPV6_PACKET_HEADER_LENGTH);
}
else {
STRING_APPEND(str, "DHCPv6 %s (%d) Transaction ID 0x%06x Length %d\n",
DHCPv6MessageName(pkt->msg_type), pkt->msg_type,
DHCPv6PacketGetTransactionID(pkt), pkt_len);
}
return;
}
void
DHCPv6PacketFPrint(FILE * file, const DHCPv6PacketRef pkt, int pkt_len)
{
CFMutableStringRef str;
str = CFStringCreateMutable(NULL, 0);
DHCPv6PacketPrintToString(str, pkt, pkt_len);
SCPrint(TRUE, file, CFSTR("%@"), str);
CFRelease(str);
return;
}