void got_one(void) { struct sockaddr_in from; struct ether_addr hfrom; struct in_addr ifrom; ssize_t result; if ((result = receive_packet(&from, &hfrom)) == -1) { warning("receive_packet failed on %s: %s", ifi->name, strerror(errno)); ifi->errors++; if ((!interface_status(ifi->name)) || (ifi->noifmedia && ifi->errors > 20)) { /* our interface has gone away. */ error("Interface %s no longer appears valid.", ifi->name); } return; } if (result == 0) return; ifrom.s_addr = from.sin_addr.s_addr; do_packet(from.sin_port, ifrom, &hfrom); }
void got_one(struct protocol *l) { struct sockaddr_in from; struct hardware hfrom; struct iaddr ifrom; ssize_t result; union { /* * Packet input buffer. Must be as large as largest * possible MTU. */ unsigned char packbuf[4095]; struct dhcp_packet packet; } u; struct interface_info *ip = l->local; if ((result = receive_packet(ip, u.packbuf, sizeof(u), &from, &hfrom)) == -1) { warning("receive_packet failed on %s: %s", ip->name, strerror(errno)); ip->errors++; if ((!interface_status(ip)) || (ip->noifmedia && ip->errors > 20)) { /* our interface has gone away. */ warning("Interface %s no longer appears valid.", ip->name); ip->dead = 1; interfaces_invalidated = 1; close(l->fd); remove_protocol(l); free(ip); } return; } if (result == 0) return; if (bootp_packet_handler) { ifrom.len = 4; memcpy(ifrom.iabuf, &from.sin_addr, ifrom.len); (*bootp_packet_handler)(ip, &u.packet, result, from.sin_port, ifrom, &hfrom); } }
static struct timeval * rtsol_check_timer(void) { static struct timeval returnval; struct timeval now, rtsol_timer; struct ifinfo *ifinfo; int flags; gettimeofday(&now, NULL); rtsol_timer = tm_max; for (ifinfo = iflist; ifinfo; ifinfo = ifinfo->next) { if (TIMEVAL_LEQ(ifinfo->expire, now)) { if (dflag > 1) warnmsg(LOG_DEBUG, __func__, "timer expiration on %s, " "state = %d", ifinfo->ifname, ifinfo->state); switch (ifinfo->state) { case IFS_DOWN: case IFS_TENTATIVE: /* interface_up returns 0 on success */ flags = interface_up(ifinfo->ifname); if (flags == 0) ifinfo->state = IFS_DELAY; else if (flags == IFS_TENTATIVE) ifinfo->state = IFS_TENTATIVE; else ifinfo->state = IFS_DOWN; break; case IFS_IDLE: { int oldstatus = ifinfo->active; int probe = 0; ifinfo->active = interface_status(ifinfo); if (oldstatus != ifinfo->active) { warnmsg(LOG_DEBUG, __func__, "%s status is changed" " from %d to %d", ifinfo->ifname, oldstatus, ifinfo->active); probe = 1; ifinfo->state = IFS_DELAY; } else if (ifinfo->probeinterval && (ifinfo->probetimer -= ifinfo->timer.tv_sec) <= 0) { /* probe timer expired */ ifinfo->probetimer = ifinfo->probeinterval; probe = 1; ifinfo->state = IFS_PROBE; } if (probe && mobile_node) defrouter_probe(ifinfo->sdl->sdl_index); break; } case IFS_DELAY: ifinfo->state = IFS_PROBE; sendpacket(ifinfo); break; case IFS_PROBE: if (ifinfo->probes < MAX_RTR_SOLICITATIONS) sendpacket(ifinfo); else { warnmsg(LOG_INFO, __func__, "No answer " "after sending %d RSs", ifinfo->probes); ifinfo->probes = 0; ifinfo->state = IFS_IDLE; } break; } rtsol_timer_update(ifinfo); } if (TIMEVAL_LT(ifinfo->expire, rtsol_timer)) rtsol_timer = ifinfo->expire; } if (TIMEVAL_EQ(rtsol_timer, tm_max)) { warnmsg(LOG_DEBUG, __func__, "there is no timer"); return(NULL); } else if (TIMEVAL_LT(rtsol_timer, now)) /* this may occur when the interval is too small */ returnval.tv_sec = returnval.tv_usec = 0; else TIMEVAL_SUB(&rtsol_timer, &now, &returnval); if (dflag > 1) warnmsg(LOG_DEBUG, __func__, "New timer is %ld:%08ld", (long)returnval.tv_sec, (long)returnval.tv_usec); return(&returnval); }
static int ifconfig(char *ifname) { struct ifinfo *ifinfo; struct sockaddr_dl *sdl; int flags; if ((sdl = if_nametosdl(ifname)) == NULL) { warnmsg(LOG_ERR, __func__, "failed to get link layer information for %s", ifname); return(-1); } if (find_ifinfo(sdl->sdl_index)) { warnmsg(LOG_ERR, __func__, "interface %s was already configured", ifname); free(sdl); return(-1); } if ((ifinfo = malloc(sizeof(*ifinfo))) == NULL) { warnmsg(LOG_ERR, __func__, "memory allocation failed"); free(sdl); return(-1); } memset(ifinfo, 0, sizeof(*ifinfo)); ifinfo->sdl = sdl; strncpy(ifinfo->ifname, ifname, sizeof(ifinfo->ifname)); /* construct a router solicitation message */ if (make_packet(ifinfo)) goto bad; /* * check if the interface is available. * also check if SIOCGIFMEDIA ioctl is OK on the interface. */ ifinfo->mediareqok = 1; ifinfo->active = interface_status(ifinfo); if (!ifinfo->mediareqok) { /* * probe routers periodically even if the link status * does not change. */ ifinfo->probeinterval = PROBE_INTERVAL; } /* activate interface: interface_up returns 0 on success */ flags = interface_up(ifinfo->ifname); if (flags == 0) ifinfo->state = IFS_DELAY; else if (flags == IFS_TENTATIVE) ifinfo->state = IFS_TENTATIVE; else ifinfo->state = IFS_DOWN; rtsol_timer_update(ifinfo); /* link into chain */ if (iflist) ifinfo->next = iflist; iflist = ifinfo; return(0); bad: free(ifinfo->sdl); free(ifinfo); return(-1); }
gboolean NetAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer user_data) { if (event.getType() != qmf::AGENT_METHOD) { return TRUE; } const std::string& methodName(event.getMethodName()); qpid::types::Variant::Map& args = event.getArguments(); if (methodName == "list") { GList *plist = NULL; GList *interface_list = NULL; _qtype::Variant::List s_list; interface_list = mh_network_get_interfaces(); for (plist = g_list_first(interface_list); plist; plist = g_list_next(plist)) { struct mh_network_interface *iface = static_cast<struct mh_network_interface *>(plist->data); s_list.push_back(mh_network_interface_get_name(iface)); } g_list_free_full(interface_list, mh_network_interface_destroy); event.addReturnArgument("iface_map", s_list); } else if (methodName == "start") { int rc = interface_status( args["iface"].asString().c_str()); if (rc == 1) { mh_network_start(args["iface"].asString().c_str()); rc = interface_status( args["iface"].asString().c_str()); } event.addReturnArgument("status", rc); } else if (methodName == "stop") { int rc = interface_status( args["iface"].asString().c_str()); if (rc == 0) { mh_network_stop(args["iface"].asString().c_str()); rc = interface_status( args["iface"].asString().c_str()); } event.addReturnArgument("status", rc); } else if (methodName == "status") { event.addReturnArgument("status", interface_status( args["iface"].asString().c_str())); } else if (methodName == "get_ip_address") { char buf[64]; event.addReturnArgument("ip", mh_network_get_ip_address( args["iface"].asString().c_str(), buf, sizeof(buf))); } else if (methodName == "get_mac_address") { char buf[32]; event.addReturnArgument("mac", mh_network_get_mac_address( args["iface"].asString().c_str(), buf, sizeof(buf))); } else { session.raiseException(event, mh_result_to_str(MH_RES_NOT_IMPLEMENTED)); goto bail; } session.methodSuccess(event); bail: return TRUE; }