コード例 #1
0
ファイル: ldp_net.c プロジェクト: millken/zhuxianB30
s32 ldp_accept(struct thread * t)
{
	s32 fd ;
	union sockunion su ;
	struct ldp_peer * peer ;
	s32 sock = THREAD_FD(t);
	struct ldp * ldp = THREAD_ARG(t);
	
	ldp->t_accept = NULL ;
	THREAD_READ_ON(master, ldp->t_accept, ldp_accept, ldp, sock);

	fd = sockunion_accept(sock, &su);
	if( fd <= 0 ) 
		return -1 ;

	peer = ldp_peer_new();
	if( NULL == peer )
	{
		close(fd);
		return -1 ;
	}
	
	peer->state = ACCEPT_PEER ;
	peer->fd = fd ;
	peer->ldp = ldp;
	peer->transport = su.sin.sin_addr.s_addr;
	peer->input = stream_new(LDP_MAX_PDU_LEN);
	
	listnode_add(ldp->accepts, peer);

	LDP_FSM_EVENT(peer, ConnectSuccess);

	return 0 ;
}
コード例 #2
0
ファイル: pim_igmp.c プロジェクト: AT-Corp/quagga-atc
static void igmp_read_on(struct igmp_sock *igmp)
{
  zassert(igmp);

  if (PIM_DEBUG_IGMP_TRACE) {
    zlog_debug("Scheduling READ event on IGMP socket fd=%d",
	       igmp->fd);
  }
  igmp->t_igmp_read = 0;
  zassert(!igmp->t_igmp_read);
  THREAD_READ_ON(master, igmp->t_igmp_read, pim_igmp_read, igmp, igmp->fd);
}
コード例 #3
0
ファイル: ldp_net.c プロジェクト: millken/zhuxianB30
s32 ldp_listen_socket(struct ldp * ldp)
{
	u8  ttl = 0;
	s32 sock  = 0;
	s32 ret = 0;
	s32 reuse = 1;
	struct sockaddr_in addr ;
	struct linger lin;

	sock = socket(AF_INET, SOCK_STREAM, 0);
	if( sock <= 0 )
		return -1 ;

	ttl = 255 ;
	ret = setsockopt(sock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
	if( 0 != ret )
		goto err;

    ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(s32));
    if (0 != ret)
        goto err;

	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET ;
	addr.sin_port   = lm->port;
	ret = bind(sock, (struct sockaddr*)&addr, sizeof(addr));
	if( 0 != ret )
		goto err ;

	lin.l_onoff = 1;
	lin.l_linger = 0;
	ret = setsockopt(sock, SOL_SOCKET, SO_LINGER, &lin, sizeof(lin));

	ret = listen(sock, 1024);
	if( 0 != ret )
		goto err ;

	ldp->listen_fd = sock ;
	THREAD_READ_ON(master, ldp->t_accept, ldp_accept, ldp, sock);

    return sock;
    
err :
	close(sock);
	return -1;
}
コード例 #4
0
ファイル: pim_pim.c プロジェクト: AT-Corp/quagga-atc
static void pim_sock_read_on(struct interface *ifp)
{
  struct pim_interface *pim_ifp;

  zassert(ifp);
  zassert(ifp->info);

  pim_ifp = ifp->info;

  if (PIM_DEBUG_PIM_TRACE) {
    zlog_debug("Scheduling READ event on PIM socket fd=%d",
	       pim_ifp->pim_sock_fd);
  }
  pim_ifp->t_pim_sock_read = 0;
  zassert(!pim_ifp->t_pim_sock_read);
  THREAD_READ_ON(master, pim_ifp->t_pim_sock_read, pim_sock_read, ifp,
		 pim_ifp->pim_sock_fd);
}
コード例 #5
0
ファイル: rcp_session.c プロジェクト: millken/zhuxianB30
/*******************************************************************************
 Func Name: rcp_session_add                                                                                                                           
   Purpose: 创建一个会话并添加到会话表中                                                           
     Input: sessiontable,会话表
            fd,创建会话的socket
            ip,会话的对方ip     
    Output: 无
    Return: ERR_RCP_SESSIONTABLE_IS_FULL,会话地址表满,无法继续添加
            ERR_FAIL,其它错误
            ERR_SUCCESS,添加成功
     Notes:                                        
--------------------------------------------------------------------------------
 Development history:
 Date        Author        ChangeId      Description 
 2009-2-4    xujian                      创建新函数                                                                                                                                 
*******************************************************************************/
s32 rcp_session_add (rcp_session_s **sessiontable, s32 fd, u32 ip)
{
    s32 i;
    s32 sessionindex = -1;
    rcp_session_s *sessionadd;
    
    if (NULL == sessiontable)
    {
        return ERROR_FAIL;
    }
    
    if (-1 == fd)
    {
        return ERROR_FAIL;
    }
    
    if (0 == ip)
    {
        return ERROR_FAIL;
    }
    
    /*判断会话是否已经到了最大会话数,如果已满返回ERR_RCP_SESSIONTABLE_IS_FULL*/
    if (g_rcp->sessionnumber == g_rcp->max_session_number)
    {
        return ERR_RCP_SESSIONTABLE_IS_FULL;
    }
    
    /*申请空间创建会话session并申请空间创建会话的输入缓冲区,输出缓冲区置为0,如果分配内存失败返回ERR_FAIL*/
    sessionadd = malloc (sizeof(rcp_session_s));
    if (NULL == sessionadd)
    {
        return ERROR_FAIL;
    }
    memset (sessionadd, 0, sizeof(rcp_session_s));
    
    sessionadd->ibuf = stream_new(SESSION_BUF_SIZE);
    sessionadd->ibuf->getp = 0;
    sessionadd->ibuf->endp = 0;
    /*sessionadd->ibuf->putp = 0;   #注释因为结构整改,该字段被取消--yuliyang*/   
    sessionadd->obuf = stream_fifo_new ();
    sessionadd->obuf->count = 0;
    sessionadd->obuf->head = NULL;
    sessionadd->obuf->tail = NULL;
    sessionadd->fd = fd;
    sessionadd->srcip = ip;
    
    /*遍历会话表*/
    for (i = 0; i < rcp_max_session_number; i++)
    {
        /*看该id是否为空,如果为空则重新赋值为新创建的会话地址,并将该会话的id值置为该id,break;*/
        if (NULL == sessiontable[i])
        {
            sessionadd->id = (u32)i + 1;
            sessionindex = i;
            break;
        }
    }
    
    /*断言确定有空的下标存放新会话*/
    assert (-1 != sessionindex);
    sessiontable[sessionindex] = sessionadd;
    
    /*初始化会话状态值为SESSION_CONNECTED*/
    sessionadd->state = SESSION_CONNECTED;
    /*初始化会话其他变量的值*/
    sessionadd->lastpktime = time (NULL);
    
    /*调用THREAD_READ_ON和THREAD_WRITE_ON添加该会话的读写thread到g_rcp->master上并赋值到会话的t_read和t_write变量*/
	
    THREAD_READ_ON (g_rcp->master, sessionadd->t_read, rcp_read, sessionadd, sessionadd->fd);
    
    g_rcp->sessionnumber++;
    
    return ERROR_SUCCESS;
}
コード例 #6
0
ファイル: pim_ssmpingd.c プロジェクト: gvsurenderreddy/quagga
static void ssmpingd_read_on(struct ssmpingd_sock *ss)
{
  zassert(!ss->t_sock_read);
  THREAD_READ_ON(master, ss->t_sock_read,
		 ssmpingd_sock_read, ss, ss->sock_fd);
}