static int ppp_tcp_client_keepalive_timer (struct thread *thread) { struct ppp_mcp_sock *peer; struct stream* s_new; peer = THREAD_ARG (thread); peer->t_keepalive = NULL; PPPD_DEBUG_TCP("Timer (keepalive timer expire), peer:%s", peer->hostname); s_new = stream_new(1024); stream_putl(s_new, 4); ppp_put_control_to_stream(s_new, REMARK_KEEPALIVE_CMD); stream_fifo_push (peer->obuf, s_new); MCP_WRITE_ON (peer->t_write, ppp_tcp_write, peer, peer->fd); MCP_TIMER_ON (peer->t_keepalive, ppp_tcp_client_keepalive_timer, peer, CLIENT_CONNECT_KEEPALIVE_TIMER); return 0; }
void remark_all_ipinfo_notify_mcp(void) { // struct remark_ipinfo ipinfo; struct ppp_mcp_sock *peer; struct stream* s_new; peer = g_ppp_mcp_sock; PPPD_DEBUG_TCP("pppd send all ip info to mcp .."); s_new = stream_new(1024); ppp_all_ipinfo_tos(s_new); stream_fifo_push (peer->obuf, s_new); MCP_WRITE_ON (peer->t_write, ppp_tcp_write, peer, peer->fd); // MCP_TIMER_ON (peer->t_wait_ipinfo_ack, ppp_tcp_wait_notify_ack_timer, peer, CLIENT_WAIT_IPINFO_ACK_TIMER); return; }
void remark_bundle_notify_mcp(unsigned int ifnum, unsigned int ifunit) { struct remark_bundle bundleinfo; struct ppp_mcp_sock *peer; struct stream* s_new; return; peer = g_ppp_mcp_sock; bundleinfo.master = ifnum; bundleinfo.slave = ifunit; s_new = stream_new(1024); stream_putl(s_new, 4 + sizeof(struct remark_bundle)); ppp_put_control_to_stream(s_new, REMARK_BUDLE_CMD); stream_put(s_new, (unsigned char*)(&bundleinfo), sizeof(struct remark_bundle)); stream_fifo_push (peer->obuf, s_new); MCP_WRITE_ON (peer->t_write, ppp_tcp_write, peer, peer->fd); // MCP_TIMER_ON (peer->t_wait_bundle_ack, ppp_tcp_wait_notify_ack_timer, peer, CLIENT_WAIT_IPINFO_ACK_TIMER); return; }
int shim_sisis_read(struct thread * thread) { struct sisis_listener *listener; int sisis_sock; uint16_t length, checksum; int already; u_int ifindex; struct shim_interface * si; struct in6_addr src; char src_buf[INET6_ADDRSTRLEN]; struct in6_addr dst; char dst_buf[INET6_ADDRSTRLEN]; zlog_notice("Reading packet from SISIS connection!"); /* first of all get listener pointer. */ listener = THREAD_ARG (thread); sisis_sock = THREAD_FD (thread); stream_reset(listener->ibuf); if ((already = stream_get_endp(listener->ibuf)) < SVZ_OUT_HEADER_SIZE) { ssize_t nbytes; if (((nbytes = stream_read_try (listener->ibuf, sisis_sock, SVZ_OUT_HEADER_SIZE-already)) == 0) || (nbytes == -1)) { return -1; } if(nbytes != (SVZ_OUT_HEADER_SIZE - already)) { listener->read_thread = thread_add_read (master, shim_sisis_read, listener, sisis_sock); return 0; } already = SVZ_OUT_HEADER_SIZE; } stream_set_getp(listener->ibuf, 0); length = stream_getw(listener->ibuf); checksum = stream_getw(listener->ibuf); if(length > STREAM_SIZE(listener->ibuf)) { struct stream * ns; zlog_warn("message size exceeds buffer size"); ns = stream_new(length); stream_copy(ns, listener->ibuf); stream_free(listener->ibuf); listener->ibuf = ns; } if(already < length) { ssize_t nbytes; if(((nbytes = stream_read_try(listener->ibuf, sisis_sock, length-already)) == 0) || nbytes == -1) { return -1; } if(nbytes != (length-already)) { listener->read_thread = thread_add_read (master, shim_sisis_read, listener, sisis_sock); return 0; } } unsigned int num_of_addrs = number_of_sisis_addrs_for_process_type(SISIS_PTYPE_RIBCOMP_OSPF6); unsigned int num_of_listeners = number_of_listeners(); zlog_notice("Number of addr: %d", num_of_addrs); zlog_notice("Number of listeners: %d", num_of_listeners); pthread_mutex_lock(&bmap_mutex); struct bmap * bmap = bmap_set(checksum); // if we added initially // set timer at which to recycle bmap // if there are no more processes sending data if(bmap->count == 0) { uint16_t * chcksum_ptr = malloc(sizeof(uint16_t)); *chcksum_ptr = checksum; listener->bmap_thread = thread_add_timer_msec (master, svz_sisis_clean_bmap, chcksum_ptr, 100); } bmap->count++; zlog_notice("# of streams %d for checksum %d with length %d", bmap->count, checksum, length); float received_ratio = (float)bmap->count/(float)num_of_addrs; stream_putw(listener->chksum_stream, checksum); if((received_ratio > 1.0/2.0) && !bmap->sent) { if(are_checksums_same()) { zlog_notice("Checksums are all the same"); if(primary_listener == NULL) primary_listener = listener; reset_checksum_streams(); svz_send(listener->ibuf); bmap->sent = 1; } else { zlog_notice("Checksums are not all the same"); stream_fifo_push(listener->dif, listener->ibuf); listener->dif_size++; } } else if(!bmap->sent) { zlog_notice("Not enough processes have sent their data; buffering..."); } else { zlog_notice("Data has already been sent..."); } if((bmap->count == num_of_addrs) && (bmap->sent)) { zlog_notice("Bmap no longer needed, freeing..."); bmap->count = 0; bmap->sent = 0; clear_checksum_streams(checksum); bmap_unset(checksum); } pthread_mutex_unlock(&bmap_mutex); if (sisis_sock < 0) /* Connection was closed during packet processing. */ return -1; /* Register read thread. */ // stream_reset(listener->ibuf); /* prepare for next packet. */ listener->read_thread = thread_add_read (master, shim_sisis_read, listener, sisis_sock); return 0; }