static int ppp_remark_mem_malloc(void) { // int i = 0, j = 0;//, k = 0; multilink_if_list = list_new(); multilink_if_list->del = (void (*)(void *))ppp_multi_info_free; remote_userinfo_list = list_new(); if(remote_userinfo_list == NULL) goto err2; remote_userinfo_list->del = (void (*)(void *))ppp_remote_info_free; g_ppp_mcp_sock = malloc(sizeof(struct ppp_mcp_sock)); if(g_ppp_mcp_sock == NULL) goto err3; memset(g_ppp_mcp_sock, 0, sizeof(struct ppp_mcp_sock)); g_ppp_mcp_sock->ibuf = stream_new(10240); g_ppp_mcp_sock->obuf = stream_fifo_new (); ppp_mcp_sock_init(g_ppp_mcp_sock); ppp_if_mem_malloc(); return 0; err3: list_free(remote_userinfo_list); err2: list_free(multilink_if_list); return -1; }
static int handle_attr_test (struct aspath_tests *t) { struct bgp bgp = { 0 }; struct peer peer = { 0 }; struct attr attr = { 0 }; int ret; int initfail = failed; struct aspath *asp; size_t datalen; asp = make_aspath (t->segment->asdata, t->segment->len, 0); peer.ibuf = stream_new (BGP_MAX_PACKET_SIZE); peer.obuf = stream_fifo_new (); peer.bgp = &bgp; peer.host = (char *)"none"; peer.fd = -1; peer.cap = t->cap; stream_write (peer.ibuf, t->attrheader, t->len); datalen = aspath_put (peer.ibuf, asp, t->as4 == AS4_DATA); ret = bgp_attr_parse (&peer, &attr, t->len + datalen, NULL, NULL); if (ret != t->result) { printf ("bgp_attr_parse returned %d, expected %d\n", ret, t->result); printf ("datalen %zd\n", datalen); failed++; } if (ret != 0) goto out; if (attr.aspath == NULL) { printf ("aspath is NULL!\n"); failed++; } if (attr.aspath && strcmp (attr.aspath->str, t->shouldbe)) { printf ("attr str and 'shouldbe' mismatched!\n" "attr str: %s\n" "shouldbe: %s\n", attr.aspath->str, t->shouldbe); failed++; } out: if (attr.aspath) aspath_unintern (&attr.aspath); if (asp) aspath_unintern (&asp); return failed - initfail; }
/* 11.2.A1: create a new peer and transition state to listen or connecting */ static enum pim_msdp_err pim_msdp_peer_new(struct pim_instance *pim, struct in_addr peer_addr, struct in_addr local_addr, const char *mesh_group_name, struct pim_msdp_peer **mp_p) { struct pim_msdp_peer *mp; pim_msdp_enable(pim); mp = XCALLOC(MTYPE_PIM_MSDP_PEER, sizeof(*mp)); mp->pim = pim; mp->peer = peer_addr; pim_inet4_dump("<peer?>", mp->peer, mp->key_str, sizeof(mp->key_str)); pim_msdp_addr2su(&mp->su_peer, mp->peer); mp->local = local_addr; /* XXX: originator_id setting needs to move to the mesh group */ pim->msdp.originator_id = local_addr; pim_msdp_addr2su(&mp->su_local, mp->local); mp->mesh_group_name = XSTRDUP(MTYPE_PIM_MSDP_MG_NAME, mesh_group_name); mp->state = PIM_MSDP_INACTIVE; mp->fd = -1; strlcpy(mp->last_reset, "-", sizeof(mp->last_reset)); /* higher IP address is listener */ if (ntohl(mp->local.s_addr) > ntohl(mp->peer.s_addr)) { mp->flags |= PIM_MSDP_PEERF_LISTENER; } /* setup packet buffers */ mp->ibuf = stream_new(PIM_MSDP_MAX_PACKET_SIZE); mp->obuf = stream_fifo_new(); /* insert into misc tables for easy access */ mp = hash_get(pim->msdp.peer_hash, mp, hash_alloc_intern); listnode_add_sort(pim->msdp.peer_list, mp); if (PIM_DEBUG_MSDP_EVENTS) { zlog_debug("MSDP peer %s created", mp->key_str); pim_msdp_peer_state_chg_log(mp); } /* fireup the connect state machine */ if (PIM_MSDP_PEER_IS_LISTENER(mp)) { pim_msdp_peer_listen(mp); } else { pim_msdp_peer_connect(mp); } if (mp_p) { *mp_p = mp; } return PIM_MSDP_ERR_NONE; }
int shim_sisis_accept(struct thread * thread) { int accept_sock; int sisis_sock; struct sisis_listener *listener; union sockunion su; char buf[SU_ADDRSTRLEN]; accept_sock = THREAD_FD (thread); if (accept_sock < 0) { zlog_err ("accept_sock is negative value %d", accept_sock); return -1; } thread_add_read (master, shim_sisis_accept, NULL, accept_sock); sisis_sock = sockunion_accept(accept_sock, &su); if (sisis_sock < 0) { zlog_err ("[Error] SISIS socket accept failed (%s)", safe_strerror (errno)); return -1; } zlog_notice ("SISIS connection from host %s", inet_sutop (&su, buf)); listener = XMALLOC (MTYPE_SHIM_SISIS_LISTENER, sizeof(*listener)); listener->fd = accept_sock; listener->ibuf = stream_new (SV_HEADER_SIZE + 1500); // memcpy(&listener->su, sa, salen); listener->sisis_fd = sisis_sock; listener->dif = stream_fifo_new(); listener->chksum_stream = stream_new(4 * 20); // need to figure out good size for buffering listener->read_thread = thread_add_read (master, shim_sisis_read, listener, sisis_sock); listnode_add (sm->listen_sockets, listener); return 0; }
/******************************************************************************* 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; }