/* * Function: dhcp_timeout * Purpose: * Wakeup the process waiting for something on a socket. */ static void dhcp_timeout(void * arg) { struct socket * * timer_arg = (struct socket * *)arg; struct socket * so = *timer_arg; dprintf(("dhcp: timeout\n")); *timer_arg = NULL; socket_lock(so, 1); sowakeup(so, &so->so_rcv); socket_unlock(so, 1); return; }
void sowwakeup(struct socket *so) { if (sb_notify(&so->so_snd)) sowakeup(so, &so->so_snd); }
/* * This may also be called for raw listeners. */ void Lpx_USER_input( struct mbuf *m, register struct lpxpcb *lpxp, struct ether_header *frame_header) { register struct lpxhdr *lpxh = mtod(m, struct lpxhdr *); // struct ifnet *ifp = m->m_pkthdr.rcvif; struct sockaddr_lpx lpx_lpx; struct ether_header *eh; // struct lpx_addr sna_addr; #if 0 eh = (struct ether_header *) m->m_pktdat; #else /* if 0 */ eh = frame_header; #endif /* if 0 else */ DEBUG_CALL(4, ("Lpx_USER_input\n")); #if 0 { int iter=0; DEBUG_CALL(6,("Lpx_USER_input:")); for (iter=0; iter<16; iter++) { DEBUG_CALL(6,(" %02x",((char*)eh)[iter])); } DEBUG_CALL(6,("\n")); } #endif /* if 0 */ if (lpxp == NULL) panic("No lpxpcb"); /* * Construct sockaddr format source address. * Stuff source address and datagram in user buffer. */ bzero(&lpx_lpx, sizeof(lpx_lpx)); lpx_lpx.slpx_len = sizeof(lpx_lpx); lpx_lpx.slpx_family = AF_LPX; bcopy(eh->ether_shost, lpx_lpx.slpx_node, LPX_NODE_LEN); lpx_lpx.slpx_port = lpxh->source_port; DEBUG_CALL(6,("Lpx_USER_input: %02x:%02x:%02x:%02x:%02x:%02x:%d\n", eh->ether_shost[0], eh->ether_shost[1], eh->ether_shost[2], eh->ether_shost[3], eh->ether_shost[4], eh->ether_shost[5], lpxh->source_port)); DEBUG_CALL(6,("Lpx_USER_input: %02x:%02x:%02x:%02x:%02x:%02x:%d\n", lpx_lpx.slpx_node[0], lpx_lpx.slpx_node[1], lpx_lpx.slpx_node[2], lpx_lpx.slpx_node[3], lpx_lpx.slpx_node[4], lpx_lpx.slpx_node[5], lpx_lpx.slpx_port)); #if 0 if (lpx_neteqnn(lpx->lpx_sna.x_net, lpx_zeronet) && ifp != NULL) { register struct ifaddr *ifa; for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa != NULL; ifa = TAILQ_NEXT(ifa, ifa_link)) { if (ifa->ifa_addr->sa_family == AF_LPX) { lpx_lpx.sipx_addr.x_net = IA_SLPX(ifa)->sipx_addr.x_net; break; } } } #endif // lpxp->lpxp_rpt = lpx->lpx_pt; if (!(lpxp->lpxp_flags & LPXP_RAWIN) ) { m_adj(m, sizeof(struct lpxhdr)); // m->m_len -= sizeof(struct lpxhdr); // m->m_pkthdr.len -= sizeof(struct lpxhdr); // m->m_data += sizeof(struct lpxhdr); } if (sbappendaddr(&lpxp->lpxp_socket->so_rcv, (struct sockaddr *)&lpx_lpx, m, (struct mbuf *)NULL) == 0) { DEBUG_CALL(2, ("!!!Lpx_USER_input: sbappendaddr error: socket=@(%lx), rcv@(%lx)!",lpxp->lpxp_socket, &(lpxp->lpxp_socket->so_rcv))); goto bad; } // m->m_len += sizeof(struct sockaddr); // m->m_pkthdr.len += sizeof(struct sockaddr); // m->m_data -= sizeof(struct sockaddr); DEBUG_CALL(4, ("Lpx_USER_input: socket sbflag=%x\n",lpxp->lpxp_socket->so_rcv.sb_flags)); #if 1 sorwakeup(lpxp->lpxp_socket); DEBUG_CALL(4, ("Lpx_USER_input: wokeup socket @(%lx)\n",lpxp->lpxp_socket)); #else /* if 0 */ if (lpxp->lpxp_socket->so_rcv.sb_flags & (SB_WAIT|SB_SEL|SB_ASYNC|SB_UPCALL)) { DEBUG_CALL(4, ("Lpx_USER_input: sowokeup socket @(%lx)\n",lpxp->lpxp_socket)); sowakeup(lpxp->lpxp_socket, &lpxp->lpxp_socket->so_rcv); } #endif /* if 0 else */ return; bad: m_freem(m); }