📄 dhcp.c
字号:
/****************************************************************************
** File: dhcp.c
**
** Author: Mike Borella
**
** Comments: Dump L2TP header information. See RFCs 2131 and 2132.
**
*****************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include "config.h"
#include "dhcp.h"
extern u_char *packet_end;
/*----------------------------------------------------------------------------
**
** dump_dhcp()
**
** Parse DHCP packet and dump fields
**
**----------------------------------------------------------------------------
*/
void dump_dhcp(u_char *bp, int length)
{
u_char *ep = bp + length;
DHCPHdr *dhcp;
int end_pad_cnt = 0;
int i;
int c;
int j;
int opt;
int done = 0;
u_int16_t s;
char hostname [DHCP_MAX_HOSTNAME];
struct in_addr in_holder;
/*
* Make sure we don't run off the end of the packet
*/
if (ep > packet_end)
ep = packet_end;
printf("-----------------------------------------------------------------\n");
printf(" DHCP Header\n");
printf("-----------------------------------------------------------------\n");
dhcp = (DHCPHdr *) bp;
printf("OP %d ", (int) dhcp->op);
switch (dhcp->op)
{
case DHCP_BOOTREQUEST:
printf("(boot request)\n");
break;
case DHCP_BOOTREPLY:
printf("(boot reply)\n");
break;
default:
printf("(unknown)\n");
}
printf("Hardware addr type: %d\n", (int) dhcp->htype);
printf("Hardware addr length: %d\n", (int) dhcp->hlen);
printf("Hops: %d\n", (int) dhcp->hops);
printf("Transaction ID: %x\n", ntohl(dhcp->xid));
printf("Seconds: %d\n", ntohs(dhcp->secs));
printf("Flags: %x\n", ntohs(dhcp->flags));
memcpy((void *) &in_holder, (void *) &dhcp->ciaddr, sizeof(struct in_addr));
printf("Client addr: %s\n", inet_ntoa(in_holder));
memcpy((void *) &in_holder, (void *) &dhcp->yiaddr, sizeof(struct in_addr));
printf("Your addr: %s\n", inet_ntoa(in_holder));
memcpy((void *) &in_holder, (void *) &dhcp->siaddr, sizeof(struct in_addr));
printf("Next server addr: %s\n", inet_ntoa(in_holder));
memcpy((void *) &in_holder, (void *) &dhcp->giaddr, sizeof(struct in_addr));
printf("Relay agent addr: %s\n", inet_ntoa(in_holder));
printf("Client hardware addr: \n");
printf("Server host name: %s\n", dhcp->sname);
printf("Boot file name: %s\n", dhcp->file);
/*
* Look for BOOTP cookie
*/
bp = bp + sizeof(DHCPHdr);
i = htonl(BOOTP_COOKIE);
memcpy((void *) &c, bp, 4);
if (i == c)
{
printf("BOOTP Cookie: %x\n", i);
bp = bp + sizeof(BOOTP_COOKIE);
}
/*
* Parse the options list
*/
while (bp < ep)
{
int len=0;
opt = (int) *bp;
if (opt > 0 && opt < 255)
len = *++bp;
if (!done)
printf("Option: %d ", opt);
bp++;
switch(opt)
{
case DHCP_OPT_PAD: /* 0 */
if (!done)
printf("(pad)\n");
else
end_pad_cnt++;
break;
case DHCP_OPT_NETMASK: /* 1 */
printf("(netmask)\n");
printf(" Length: %d\n", len);
memcpy((void *) &in_holder, bp, sizeof(struct in_addr));
printf(" Mask: %s\n", inet_ntoa(in_holder));
bp = bp + sizeof(struct in_addr);
break;
case DHCP_OPT_TIMEOFFSET: /* 2 */
printf("(time offset)\n");
printf(" Length: %d\n", len);
memcpy((void *) &i, bp, sizeof(int));
printf(" Offset: %d\n", ntohl(i));
bp = bp + sizeof(u_int32_t);
break;
case DHCP_OPT_ROUTER: /* 3 */
printf("(routers)\n");
printf(" Length: %d\n", len);
j = 0;
while (j < len / 4)
{
memcpy((void *) &in_holder, bp, sizeof(struct in_addr));
printf(" Address: %s\n", inet_ntoa(in_holder));
bp = bp + sizeof(struct in_addr);
j++;
}
break;
case DHCP_OPT_DNS: /* 6 */
printf("(DNS)\n");
printf(" Length: %d\n", len);
j = 0;
while (j < len / 4)
{
memcpy((void *) &in_holder, bp, sizeof(struct in_addr));
printf(" Address: %s\n", inet_ntoa(in_holder));
bp = bp + sizeof(struct in_addr);
j++;
}
break;
case DHCP_OPT_HOSTNAME: /* 12 */
printf("(host name)\n");
printf(" Length: %d\n", len);
memcpy(hostname, bp, len);
hostname[len] = '\0';
printf(" Host name: %s\n", hostname);
bp = bp + len;
break;
case DHCP_OPT_DOMAINNAME: /* 15 */
printf("(domain name)\n");
printf(" Length: %d\n", len);
memcpy(hostname, bp, len);
hostname[len] = '\0';
printf(" Domain name: %s\n", hostname);
bp = bp + len;
break;
case DHCP_OPT_VENDORSPECIFIC: /* 43 */
printf("(vendor specific parameters)\n");
printf(" Length: %d\n", len);
printf(" Parameters: ");
for (i=0; i<len; i++)
{
printf("%x ", *bp);
bp++;
}
printf("\n");
break;
case DHCP_OPT_NETBIOSNAMESERV: /* 44 */
printf("(netbios name servers)\n");
printf(" Length: %d\n", len);
j = 0;
while (j < len / 4)
{
memcpy((void *) &in_holder, bp, sizeof(struct in_addr));
printf(" Address: %s\n", inet_ntoa(in_holder));
bp = bp + sizeof(struct in_addr);
j++;
}
break;
case DHCP_OPT_NETBIOSNODETYPE: /* 46 */
printf("(netbios node type)\n");
printf(" Length: %d\n", len);
printf(" Node type: ");
switch(*bp)
{
case 0x1:
printf("B\n");
break;
case 0x2:
printf("P\n");
break;
case 0x4:
printf("M\n");
break;
case 0x8:
printf("H\n");
break;
}
bp++;
break;
case DHCP_OPT_REQUESTEDIPADDR: /* 50 */
printf("(requested IP address)\n");
printf(" Length: %d\n", len);
memcpy((void *) &in_holder, bp, sizeof(struct in_addr));
printf(" Address: %s\n", inet_ntoa(in_holder));
bp = bp + sizeof(struct in_addr);
break;
case DHCP_OPT_IPADDRLEASE: /* 51 */
printf("(IP address lease time)\n");
printf(" Length: %d\n", len);
memcpy((void *) &i, bp, sizeof(int));
printf(" Lease time: %d\n", ntohl(i));
bp = bp + sizeof(u_int32_t);
break;
case DHCP_OPT_MESSAGETYPE: /* 53 */
printf("(message type)\n");
printf(" Length: %d\n", len);
printf(" Type: ");
switch(*bp)
{
case 1:
printf("DHCPDISCOVER\n");
break;
case 2:
printf("DHCPOFFER\n");
break;
case 3:
printf("DHCPREQUEST\n");
break;
case 4:
printf("DHCPDECLINE\n");
break;
case 5:
printf("DHCPACK\n");
break;
case 6:
printf("DHCPNAK\n");
break;
case 7:
printf("DHCPRELEASE\n");
break;
case 8:
printf("DHCPINFORM\n");
break;
default:
printf("unknown\n");
break;
}
bp++;
break;
case DHCP_OPT_SERVERID: /* 54 */
printf("(server ID)\n");
printf(" Length: %d\n", len);
memcpy((void *) &in_holder, bp, sizeof(struct in_addr));
printf(" Address: %s\n", inet_ntoa(in_holder));
bp = bp + sizeof(struct in_addr);
break;
case DHCP_OPT_PARAMREQLIST: /* 55 */
printf("(DHCP options requested)\n");
printf(" Length: %d\n", len);
for (i=0; i < len; i++)
{
printf(" Option requested: %d\n", (u_int32_t) *bp);
bp++;
}
break;
case DHCP_OPT_MAXDHCPMSGSIZE: /* 57 */
printf("(max message size)\n");
printf(" Length: %d\n", len);
memcpy((void *) &s, bp, sizeof(u_int16_t));
printf(" Size: %d\n", ntohs(s));
bp = bp + sizeof(u_int16_t);
break;
case DHCP_OPT_RENEWALTIME: /* 58 */
printf("(renewal time)\n");
printf(" Length: %d\n", len);
memcpy((void *) &i, bp, sizeof(u_int32_t));
printf(" Renewal time: %d\n", ntohl(i));
bp = bp + sizeof(u_int32_t);
break;
case DHCP_OPT_REBINDINGTIME: /* 59 */
printf("(rebinding time)\n");
printf(" Length: %d\n", len);
memcpy((void *) &i, bp, sizeof(u_int32_t));
printf(" Rebinding time: %d\n", ntohl(i));
bp = bp + sizeof(u_int32_t);
break;
case DHCP_OPT_VENDORCLASSID: /* 60 */
printf("(vendor class ID)\n");
printf(" Length: %d\n", len);
printf(" Parameters: ");
for (i=0; i<len; i++)
{
printf("%x ", *bp);
bp++;
}
printf("\n");
break;
case DHCP_OPT_CLIENTID: /* 61 */
printf("(client ID)\n");
printf(" Length: %d\n", len);
printf(" Parameters: ");
for (i=0; i<len; i++)
{
printf("%x ", *bp);
bp++;
}
printf("\n");
break;
case DHCP_OPT_END: /* 255 */
printf("(end of options)\n");
done = 1;
bp++;
break;
default:
printf("(unknown)\n");
printf(" Length: %d\n", len);
bp = bp + len;
} /* switch */
} /* while */
printf("%d padding bytes\n", end_pad_cnt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -