int main(int argc, char*argv[]) { int i,f; char *p; FILE *fp; char ** a; struct ifreq ifr; struct sockaddr_in*in; struct rtentry rt; char * dev = "lo"; struct termios tty; int speed; open_raw_socket(); setifaddr(dev, "127.0.0.1"); setifflags(dev, IFF_UP | IFF_RUNNING | IFF_LOOPBACK); addroute(dev, RTF_UP/* | RTF_HOST*/, "127.0.0.0" /* dest net */, "255.0.0.0" /* netmask */, 0 /* gateway */); close_raw_socket(); }
int dhcp_init_ifc(const char *ifname) { dhcp_msg discover_msg; dhcp_msg request_msg; dhcp_msg reply; dhcp_msg *msg; dhcp_info info; int s, r, size; int valid_reply; uint32_t xid; unsigned char hwaddr[6]; struct pollfd pfd; unsigned int state; unsigned int timeout; int if_index; xid = (uint32_t) get_msecs(); if (ifc_get_hwaddr(ifname, hwaddr)) { return fatal("cannot obtain interface address"); } if (ifc_get_ifindex(ifname, &if_index)) { return fatal("cannot obtain interface index"); } s = open_raw_socket(ifname, hwaddr, if_index); timeout = TIMEOUT_INITIAL; state = STATE_SELECTING; info.type = 0; goto transmit; for (;;) { pfd.fd = s; pfd.events = POLLIN; pfd.revents = 0; r = poll(&pfd, 1, timeout); if (r == 0) { #if VERBOSE printerr("TIMEOUT\n"); #endif if (timeout >= TIMEOUT_MAX) { printerr("timed out\n"); if ( info.type == DHCPOFFER ) { printerr("no acknowledgement from DHCP server\nconfiguring %s with offered parameters\n", ifname); return dhcp_configure(ifname, &info); } errno = ETIME; close(s); return -1; } timeout = timeout * 2; transmit: size = 0; msg = NULL; switch(state) { case STATE_SELECTING: msg = &discover_msg; size = init_dhcp_discover_msg(msg, hwaddr, xid); break; case STATE_REQUESTING: msg = &request_msg; size = init_dhcp_request_msg(msg, hwaddr, xid, info.ipaddr, info.serveraddr); break; default: r = 0; } if (size != 0) { r = send_message(s, if_index, msg, size); if (r < 0) { printerr("error sending dhcp msg: %s\n", strerror(errno)); } } continue; } if (r < 0) { if ((errno == EAGAIN) || (errno == EINTR)) { continue; } return fatal("poll failed"); } errno = 0; r = receive_packet(s, &reply); if (r < 0) { if (errno != 0) { LOGD("receive_packet failed (%d): %s", r, strerror(errno)); if (errno == ENETDOWN || errno == ENXIO) { return -1; } } continue; } #if VERBOSE > 1 dump_dhcp_msg(&reply, r); #endif decode_dhcp_msg(&reply, r, &info); if (state == STATE_SELECTING) { valid_reply = is_valid_reply(&discover_msg, &reply, r); } else { valid_reply = is_valid_reply(&request_msg, &reply, r); } if (!valid_reply) { printerr("invalid reply\n"); continue; } if (verbose) dump_dhcp_info(&info); switch(state) { case STATE_SELECTING: if (info.type == DHCPOFFER) { state = STATE_REQUESTING; timeout = TIMEOUT_INITIAL; xid++; goto transmit; } break; case STATE_REQUESTING: if (info.type == DHCPACK) { printerr("configuring %s\n", ifname); close(s); return dhcp_configure(ifname, &info); } else if (info.type == DHCPNAK) { printerr("configuration request denied\n"); close(s); return -1; } else { printerr("ignoring %s message in state %d\n", dhcp_type_to_name(info.type), state); } break; } } close(s); return 0; }