static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type,

                        const struct in_addr **preq_addr)

{

    const uint8_t *p, *p_end;

    int len, tag;



    *pmsg_type = 0;

    *preq_addr = NULL;



    p = bp->bp_vend;

    p_end = p + DHCP_OPT_LEN;

    if (memcmp(p, rfc1533_cookie, 4) != 0)

        return;

    p += 4;

    while (p < p_end) {

        tag = p[0];

        if (tag == RFC1533_PAD) {

            p++;

        } else if (tag == RFC1533_END) {

            break;

        } else {

            p++;

            if (p >= p_end)

                break;

            len = *p++;

            DPRINTF("dhcp: tag=%d len=%d\n", tag, len);



            switch(tag) {

            case RFC2132_MSG_TYPE:

                if (len >= 1)

                    *pmsg_type = p[0];

                break;

            case RFC2132_REQ_ADDR:

                if (len >= 4)

                    *preq_addr = (struct in_addr *)p;

                break;

            default:

                break;

            }

            p += len;

        }

    }

    if (*pmsg_type == DHCPREQUEST && !*preq_addr && bp->bp_ciaddr.s_addr) {

        *preq_addr = &bp->bp_ciaddr;

    }

}

static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type,

                        const struct in_addr **preq_addr)

{

    const uint8_t *p, *p_end;

    int len, tag;



    *pmsg_type = 0;

    *preq_addr = NULL;



    p = bp->bp_vend;

    p_end = p + DHCP_OPT_LEN;

    if (memcmp(p, rfc1533_cookie, 4) != 0)

        return;

    p += 4;

    while (p < p_end) {

        tag = p[0];

        if (tag == RFC1533_PAD) {

            p++;

        } else if (tag == RFC1533_END) {

            break;

        } else {

            p++;

            if (p >= p_end)

                break;

            len = *p++;

            DPRINTF("dhcp: tag=%d len=%d\n", tag, len);



            switch(tag) {

            case RFC2132_MSG_TYPE:

                if (len >= 1)

                    *pmsg_type = p[0];

                break;

            case RFC2132_REQ_ADDR:

                if (len >= 4)

                    *preq_addr = (struct in_addr *)p;

                break;

            default:

                break;

            }

            p += len;

        }

    }

    if (*pmsg_type == DHCPREQUEST && !*preq_addr && bp->bp_ciaddr.s_addr) {

        *preq_addr = &bp->bp_ciaddr;

    }

}

static void FUNC_0(const struct bootp_t *VAR_0, int *VAR_1,

                        const struct in_addr **VAR_2)

{

    const uint8_t *VAR_3, *p_end;

    int VAR_4, VAR_5;



    *VAR_1 = 0;

    *VAR_2 = NULL;



    VAR_3 = VAR_0->bp_vend;

    p_end = VAR_3 + DHCP_OPT_LEN;

    if (memcmp(VAR_3, rfc1533_cookie, 4) != 0)

        return;

    VAR_3 += 4;

    while (VAR_3 < p_end) {

        VAR_5 = VAR_3[0];

        if (VAR_5 == RFC1533_PAD) {

            VAR_3++;

        } else if (VAR_5 == RFC1533_END) {

            break;

        } else {

            VAR_3++;

            if (VAR_3 >= p_end)

                break;

            VAR_4 = *VAR_3++;

            DPRINTF("dhcp: VAR_5=%d VAR_4=%d\n", VAR_5, VAR_4);



            switch(VAR_5) {

            case RFC2132_MSG_TYPE:

                if (VAR_4 >= 1)

                    *VAR_1 = VAR_3[0];

                break;

            case RFC2132_REQ_ADDR:

                if (VAR_4 >= 4)

                    *VAR_2 = (struct in_addr *)VAR_3;

                break;

            default:

                break;

            }

            VAR_3 += VAR_4;

        }

    }

    if (*VAR_1 == DHCPREQUEST && !*VAR_2 && VAR_0->bp_ciaddr.s_addr) {

        *VAR_2 = &VAR_0->bp_ciaddr;

    }

}

static void FUNC_0(const struct bootp_t *VAR_0, int *VAR_1,
const struct in_addr **VAR_2)
{ const uint8_t *VAR_3, *p_end; int VAR_4, VAR_5; *VAR_1 = 0; *VAR_2 = NULL; VAR_3 = VAR_0->bp_vend; p_end = VAR_3 + DHCP_OPT_LEN; if (memcmp(VAR_3, rfc1533_cookie, 4) != 0)
return; VAR_3 += 4; while (VAR_3 < p_end) { VAR_5 = VAR_3[0]; if (VAR_5 == RFC1533_PAD) { VAR_3++; } else if (VAR_5 == RFC1533_END) { break; } else { VAR_3++; if (VAR_3 >= p_end)
break; VAR_4 = *VAR_3++; DPRINTF("dhcp: VAR_5=%d VAR_4=%d\n", VAR_5, VAR_4); switch(VAR_5) { case RFC2132_MSG_TYPE:
if (VAR_4 >= 1)
*VAR_1 = VAR_3[0]; break; case RFC2132_REQ_ADDR:
if (VAR_4 >= 4)
*VAR_2 = (struct in_addr *)VAR_3; break; default:
break; } VAR_3 += VAR_4; } } if (*VAR_1 == DHCPREQUEST && !*VAR_2 && VAR_0->bp_ciaddr.s_addr) { *VAR_2 = &VAR_0->bp_ciaddr; } }