Ejemplo n.º 1
0
Archivo: in_dhcp.c Proyecto: Prajna/xnu
/*
 * 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;
}
Ejemplo n.º 2
0
void
sowwakeup(struct socket *so)
{
        if (sb_notify(&so->so_snd))
                sowakeup(so, &so->so_snd);
}
Ejemplo n.º 3
0
/*
 *  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);
}