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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
/* 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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
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;
}