source: bootcd/isolinux/syslinux-6.03/com32/modules/prdhcp.c @ 26ffad7

Last change on this file since 26ffad7 was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 4.3 KB
Line 
1/* ----------------------------------------------------------------------- *
2 *
3 *   Copyright 2010-2011 Gene Cumm - All Rights Reserved
4 *
5 *   Portions from chain.c:
6 *   Copyright 2003-2009 H. Peter Anvin - All Rights Reserved
7 *   Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
8 *   Significant portions copyright (C) 2010 Shao Miller
9 *                                      [partition iteration, GPT, "fs"]
10 *
11 *   This program is free software; you can redistribute it and/or modify
12 *   it under the terms of the GNU General Public License as published by
13 *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
14 *   Boston MA 02111-1307, USA; either version 2 of the License, or
15 *   (at your option) any later version; incorporated herein by reference.
16 *
17 * ----------------------------------------------------------------------- */
18
19/*
20 * prdhcp.c
21 *
22 * Print the contents of the 3 DHCP packets
23 */
24
25#include <stdio.h>
26#include <stdlib.h>
27#include <consoles.h>
28#include <console.h>
29#include <errno.h>
30#include <string.h>
31#include <syslinux/config.h>
32#include <syslinux/loadfile.h>
33#include <syslinux/bootrm.h>
34#include <syslinux/video.h>
35#include <com32.h>
36#include <stdint.h>
37#include <syslinux/pxe.h>
38#include <sys/gpxe.h>
39#include <unistd.h>
40#include <getkey.h>
41
42#define PRDHCP_DEBUG 0
43
44#define dprintf0(f, ...)                ((void)0)
45
46#ifdef PRDHCP_DEBUG
47#  define dpressanykey                  pressanykey
48#  define dprintf                       printf
49#  define dprint_pxe_bootp_t            print_pxe_bootp_t
50#  define dprint_pxe_vendor_blk         print_pxe_vendor_blk
51#  define dprint_pxe_vendor_raw         print_pxe_vendor_raw
52#else
53#  define dpressanykey(void)            ((void)0)
54#  define dprintf(f, ...)               ((void)0)
55#  define dprint_pxe_bootp_t(p, l)      ((void)0)
56#  define dprint_pxe_vendor_blk(p, l)   ((void)0)
57#  define dprint_pxe_vendor_raw(p, l)   ((void)0)
58#endif
59
60#define dprintf_opt_cp  dprintf0
61#define dprintf_opt_inj dprintf
62
63
64const char app_name_str[] = "prdhcp.c32";
65
66
67int pressanykey(void) {
68    int inc;
69
70    printf("Press any key to continue. ");
71    inc = KEY_NONE;
72    while (inc == KEY_NONE)
73        inc = get_key(stdin, 6000);
74    puts("");
75    return inc;
76}
77
78void print_pxe_vendor_blk(pxe_bootp_t *p, size_t len)
79{
80    int i, vlen, oplen, j;
81    uint8_t *d;
82    uint32_t magic;
83    if (!p) {
84        printf("  packet pointer is null\n");
85        return;
86    }
87    vlen = len - ((void *)&(p->vendor) - (void *)p);
88    printf("  Vendor Data:    Len=%d", vlen);
89    d = p->vendor.d;
90    /* Print only 256 characters of the vendor/option data */
91    /*
92    print_pxe_vendor_raw(p, (len - vlen) + 256);
93    vlen = 0;
94    */
95    magic = ntohl(*((uint32_t *)d));
96    printf("    Magic: %08X", ntohl(*((uint32_t *)d)));
97    if (magic != VM_RFC1048)    /* Invalid DHCP packet */
98        vlen = 0;
99    for (i = 4; i < vlen; i++) {
100        if (d[i])       /* Skip the padding */
101            printf("\n    @%03X-%3d", i, d[i]);
102        if (d[i] == 255)        /* End of list */
103            break;
104        if (d[i]) {
105            oplen = d[++i];
106            printf(" l=%3d:", oplen);
107            for (j = (++i + oplen); i < vlen && i < j; i++) {
108                printf(" %02X", d[i]);
109            }
110            i--;
111        }
112    }
113    printf("\n");
114}
115
116void print_pxe_bootp_t(pxe_bootp_t *p, size_t len)
117{
118    if (!p) {
119        printf("  packet pointer is null\n");
120        return;
121    }
122    printf("  op:%02X  hw:%02X  hl:%02X  gh:%02X  id:%08X se:%04X f:%04X"
123        "  cip:%08X\n", p->opcode, p->Hardware, p->Hardlen, p->Gatehops,
124        ntohl(p->ident), ntohs(p->seconds), ntohs(p->Flags), ntohl(p->cip));
125    printf("  yip:%08X  sip:%08X  gip:%08X",
126        ntohl(p->yip), ntohl(p->sip), ntohl(p->gip));
127    printf("  caddr-%02X:%02X:%02X:%02X:%02X:%02X\n", p->CAddr[0],
128        p->CAddr[1], p->CAddr[2], p->CAddr[3], p->CAddr[4], p->CAddr[5]);
129    printf("  sName: '%s'\n", p->Sname);
130    printf("  bootfile: '%s'\n", p->bootfile);
131    print_pxe_vendor_blk(p, len);
132}
133
134void print_dhcp_pkt_all(void)
135{
136    pxe_bootp_t *p;
137    size_t len;
138    int i;
139    int ptype[3] = {PXENV_PACKET_TYPE_DHCP_DISCOVER, PXENV_PACKET_TYPE_DHCP_ACK, PXENV_PACKET_TYPE_CACHED_REPLY};
140
141    for (i = 0; i < 3; i++) {
142        if (!pxe_get_cached_info(ptype[i],
143                (void **)&(p), &(len))) {
144            dprintf("Got packet #%d/%d\n", (i + 1), ptype[i]);
145            print_pxe_bootp_t(p, len);
146            pressanykey();
147        }
148    }
149}
150
151int main(void)
152{
153    int rv= -1;
154    const struct syslinux_version *sv;
155
156    console_ansi_raw();
157    sv = syslinux_version();
158    if (sv->filesystem != SYSLINUX_FS_PXELINUX) {
159        printf("%s: May only run in PXELINUX\n", app_name_str);
160        return -2;
161    }
162    print_dhcp_pkt_all();
163    return rv;
164}
Note: See TracBrowser for help on using the repository browser.