Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/networking/udhcp/packet.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/networking/udhcp/packet.c
r821 r1770 1 #include <unistd.h> 2 #include <string.h> 1 /* vi: set sw=4 ts=4: */ 2 3 3 #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 8 5 #include <netpacket/packet.h> 9 6 #include <net/ethernet.h> … … 13 10 #include <linux/if_ether.h> 14 11 #endif 15 #include <errno.h>16 12 17 13 #include "common.h" 18 #include "packet.h"19 14 #include "dhcpd.h" 20 15 #include "options.h" … … 47 42 int udhcp_get_packet(struct dhcpMessage *packet, int fd) 48 43 { 44 #if 0 49 45 static const char broken_vendors[][8] = { 50 46 "MSFT 98", 51 47 "" 52 48 }; 49 #endif 53 50 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)); 59 55 if (bytes < 0) { 60 DEBUG( LOG_INFO, "couldn't read on listening socket, ignoring");56 DEBUG("cannot read on listening socket, ignoring"); 61 57 return -1; 62 58 } 63 59 64 60 if (ntohl(packet->cookie) != DHCP_MAGIC) { 65 LOG(LOG_ERR,"received bogus message, ignoring");61 bb_error_msg("received bogus message, ignoring"); 66 62 return -2; 67 63 } 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"); 76 85 packet->flags |= htons(BROADCAST_FLAG); 77 86 } 87 #endif 78 88 } 79 89 } … … 88 98 * beginning at location "addr". 89 99 */ 90 registerint32_t sum = 0;100 int32_t sum = 0; 91 101 uint16_t *source = (uint16_t *) addr; 92 102 … … 114 124 115 125 /* 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) 126 void BUG_sizeof_struct_udp_dhcp_packet_must_be_576(void); 127 int 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) 118 130 { 119 131 int fd; … … 122 134 struct udp_dhcp_packet packet; 123 135 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"); 126 139 return -1; 127 140 } … … 136 149 memcpy(dest.sll_addr, dest_arp, 6); 137 150 if (bind(fd, (struct sockaddr *)&dest, sizeof(struct sockaddr_ll)) < 0) { 138 DEBUG(LOG_ERR, "bind call failed: %m");151 bb_perror_msg("bind"); 139 152 close(fd); 140 153 return -1; … … 157 170 packet.ip.check = udhcp_checksum(&(packet.ip), sizeof(packet.ip)); 158 171 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)); 160 177 if (result <= 0) { 161 DEBUG(LOG_ERR, "write on socket failed: %m");178 bb_perror_msg("sendto"); 162 179 } 163 180 close(fd); … … 167 184 168 185 /* 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; 186 int udhcp_kernel_packet(struct dhcpMessage *payload, 187 uint32_t source_ip, int source_port, 188 uint32_t dest_ip, int dest_port) 189 { 173 190 int fd, result; 174 191 struct sockaddr_in client; 175 192 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); 183 198 184 199 memset(&client, 0, sizeof(client)); … … 187 202 client.sin_addr.s_addr = source_ip; 188 203 189 if (bind(fd, (struct sockaddr *)&client, sizeof( struct sockaddr)) == -1) {204 if (bind(fd, (struct sockaddr *)&client, sizeof(client)) == -1) { 190 205 close(fd); 191 206 return -1;
Note:
See TracChangeset
for help on using the changeset viewer.