Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (17 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/networking/udhcp/packet.c

    r821 r1765  
    1 #include <unistd.h>
    2 #include <string.h>
     1/* vi: set sw=4 ts=4: */
     2
    33#include <netinet/in.h>
    4 #include <sys/types.h>
    5 #include <sys/socket.h>
    6 #include <features.h>
    7 #if (__GLIBC__ >= 2 && __GLIBC_MINOR >= 1) || defined _NEWLIB_VERSION
     4#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION
    85#include <netpacket/packet.h>
    96#include <net/ethernet.h>
     
    1310#include <linux/if_ether.h>
    1411#endif
    15 #include <errno.h>
    1612
    1713#include "common.h"
    18 #include "packet.h"
    1914#include "dhcpd.h"
    2015#include "options.h"
     
    4742int udhcp_get_packet(struct dhcpMessage *packet, int fd)
    4843{
     44#if 0
    4945    static const char broken_vendors[][8] = {
    5046        "MSFT 98",
    5147        ""
    5248    };
     49#endif
    5350    int bytes;
    54     int i;
    55     char unsigned *vendor;
    56 
    57     memset(packet, 0, sizeof(struct dhcpMessage));
    58     bytes = read(fd, packet, sizeof(struct dhcpMessage));
     51    unsigned char *vendor;
     52
     53    memset(packet, 0, sizeof(*packet));
     54    bytes = read(fd, packet, sizeof(*packet));
    5955    if (bytes < 0) {
    60         DEBUG(LOG_INFO, "couldn't read on listening socket, ignoring");
     56        DEBUG("cannot read on listening socket, ignoring");
    6157        return -1;
    6258    }
    6359
    6460    if (ntohl(packet->cookie) != DHCP_MAGIC) {
    65         LOG(LOG_ERR, "received bogus message, ignoring");
     61        bb_error_msg("received bogus message, ignoring");
    6662        return -2;
    6763    }
    68     DEBUG(LOG_INFO, "Received a packet");
    69 
    70     if (packet->op == BOOTREQUEST && (vendor = get_option(packet, DHCP_VENDOR))) {
    71         for (i = 0; broken_vendors[i][0]; i++) {
    72             if (vendor[OPT_LEN - 2] == (uint8_t) strlen(broken_vendors[i]) &&
    73                 !strncmp((char*)vendor, broken_vendors[i], vendor[OPT_LEN - 2])) {
    74                 DEBUG(LOG_INFO, "broken client (%s), forcing broadcast",
    75                     broken_vendors[i]);
     64    DEBUG("Received a packet");
     65
     66    if (packet->op == BOOTREQUEST) {
     67        vendor = get_option(packet, DHCP_VENDOR);
     68        if (vendor) {
     69#if 0
     70            int i;
     71            for (i = 0; broken_vendors[i][0]; i++) {
     72                if (vendor[OPT_LEN - 2] == (uint8_t)strlen(broken_vendors[i])
     73                 && !strncmp((char*)vendor, broken_vendors[i], vendor[OPT_LEN - 2])
     74                ) {
     75                    DEBUG("broken client (%s), forcing broadcast",
     76                        broken_vendors[i]);
     77                    packet->flags |= htons(BROADCAST_FLAG);
     78                }
     79            }
     80#else
     81            if (vendor[OPT_LEN - 2] == (uint8_t)(sizeof("MSFT 98")-1)
     82             && memcmp(vendor, "MSFT 98", sizeof("MSFT 98")-1) == 0
     83            ) {
     84                DEBUG("broken client (%s), forcing broadcast", "MSFT 98");
    7685                packet->flags |= htons(BROADCAST_FLAG);
    7786            }
     87#endif
    7888        }
    7989    }
     
    8898     *         beginning at location "addr".
    8999     */
    90     register int32_t sum = 0;
     100    int32_t sum = 0;
    91101    uint16_t *source = (uint16_t *) addr;
    92102
     
    114124
    115125/* Construct a ip/udp header for a packet, and specify the source and dest hardware address */
    116 int udhcp_raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port,
    117            uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex)
     126void BUG_sizeof_struct_udp_dhcp_packet_must_be_576(void);
     127int udhcp_raw_packet(struct dhcpMessage *payload,
     128        uint32_t source_ip, int source_port,
     129        uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, int ifindex)
    118130{
    119131    int fd;
     
    122134    struct udp_dhcp_packet packet;
    123135
    124     if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0) {
    125         DEBUG(LOG_ERR, "socket call failed: %m");
     136    fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
     137    if (fd < 0) {
     138        bb_perror_msg("socket");
    126139        return -1;
    127140    }
     
    136149    memcpy(dest.sll_addr, dest_arp, 6);
    137150    if (bind(fd, (struct sockaddr *)&dest, sizeof(struct sockaddr_ll)) < 0) {
    138         DEBUG(LOG_ERR, "bind call failed: %m");
     151        bb_perror_msg("bind");
    139152        close(fd);
    140153        return -1;
     
    157170    packet.ip.check = udhcp_checksum(&(packet.ip), sizeof(packet.ip));
    158171
    159     result = sendto(fd, &packet, sizeof(struct udp_dhcp_packet), 0, (struct sockaddr *) &dest, sizeof(dest));
     172    if (sizeof(struct udp_dhcp_packet) != 576)
     173        BUG_sizeof_struct_udp_dhcp_packet_must_be_576();
     174
     175    result = sendto(fd, &packet, sizeof(struct udp_dhcp_packet), 0,
     176            (struct sockaddr *) &dest, sizeof(dest));
    160177    if (result <= 0) {
    161         DEBUG(LOG_ERR, "write on socket failed: %m");
     178        bb_perror_msg("sendto");
    162179    }
    163180    close(fd);
     
    167184
    168185/* Let the kernel do all the work for packet generation */
    169 int udhcp_kernel_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port,
    170            uint32_t dest_ip, int dest_port)
    171 {
    172     int n = 1;
     186int udhcp_kernel_packet(struct dhcpMessage *payload,
     187        uint32_t source_ip, int source_port,
     188        uint32_t dest_ip, int dest_port)
     189{
    173190    int fd, result;
    174191    struct sockaddr_in client;
    175192
    176     if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    177         return -1;
    178 
    179     if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) {
    180         close(fd);
    181         return -1;
    182     }
     193    fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
     194    if (fd < 0)
     195        return -1;
     196
     197    setsockopt_reuseaddr(fd);
    183198
    184199    memset(&client, 0, sizeof(client));
     
    187202    client.sin_addr.s_addr = source_ip;
    188203
    189     if (bind(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) {
     204    if (bind(fd, (struct sockaddr *)&client, sizeof(client)) == -1) {
    190205        close(fd);
    191206        return -1;
Note: See TracChangeset for help on using the changeset viewer.