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 ; }
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); }
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; }
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); }
/******************************************************************************* 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; }
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); }