コード例 #1
0
/*
 * Release bastet sock and Post sock close information.
 */
void bastet_sock_release(struct sock *sk)
{
	struct bst_close_sock_prop prop;
	struct bastet_sock *bsk = sk->bastet;

	if (!is_bastet_enabled()) {
		return;
	}

	if (NULL != bsk) {
		bastet_get_comm_prop(sk, &prop.comm_prop);
		prop.proxy_id = bsk->proxy_id;

		BASTET_LOGI("indicate socket close, proxyId=0x%08X", prop.proxy_id);
		post_indicate_packet(BST_IND_SOCK_CLOSED, &prop, sizeof(struct bst_close_sock_prop));

		if (NULL != bsk->sync_p) {
			kfree(bsk->sync_p);
			bsk->sync_p = NULL;
		}

		kfree(sk->bastet);
		sk->bastet = NULL;
	}

	if (sk->reconn) {
		BASTET_LOGI("kfree sk reconn");
		kfree(sk->reconn);
		sk->reconn = NULL;
	}
}
コード例 #2
0
/*
 * Sock requests sock sync when sock is invalid.
 */
static int request_sock_sync(struct sock *sk)
{
	int err;
	struct bst_sock_comm_prop prop;

	sk->bastet->bastet_sock_state = BST_SOCK_UPDATING;

	setup_sock_sync_request_timer(sk, false);

	bastet_get_comm_prop(sk, &prop);

	err = post_indicate_packet(BST_IND_SOCK_SYNC_REQ, &prop, sizeof(prop));
	return err;
}
コード例 #3
0
void bastet_comm_recv(MsgBlock *pMsg)
{
    u32 len = 0;
    BASTET_MSG_STRU *pTmpMsg = (BASTET_MSG_STRU *)pMsg;

    if (NULL == pMsg) {
        BASTET_LOGE("MsgBlock is empty");
        return;
    }

    len = pTmpMsg->usLen;
    if (len > BST_MAX_WRITE_PAYLOAD) {
        len = BST_MAX_WRITE_PAYLOAD;
    }
    post_indicate_packet(BST_IND_HISICOM, pTmpMsg->aucValue, len);
}
コード例 #4
0
/*
 * BST_TMR_DELAY_SOCK_SYNC timeout.
 * If sock is ready, get sock sync properties and post them to daemon
 */
static void delay_sock_bastet_timeout(struct sock *sk)
{
	int err;
	struct bst_set_sock_sync_prop sock_p;
	struct bastet_sock *bsk = sk->bastet;

	/* Accurating time */
	if (time_after(bsk->bastet_timeout, jiffies)) {
		sk_reset_timer(sk, &bsk->bastet_timer, bsk->bastet_timeout);
		return;
	}

	/* We must reset timer event, bastet_delay_sock_sync_notify depends on it
	 * this code must be put after accurating time
	 */
	bsk->bastet_timer_event = BST_TMR_EVT_INVALID;

	/* In repair mode or userspace needs repair, do not sync sock */
	if (unlikely(tcp_sk(sk)->repair || bsk->need_repair)) {
		BASTET_LOGE("sk: %p in repair mode", sk);
		return;
	}

	if (TCP_ESTABLISHED != sk->sk_state) {
		BASTET_LOGE("sk: %p sk_state is not TCP_ESTABLISHED", sk);
		return;
	}

	if (BST_SOCK_VALID != bsk->bastet_sock_state) {
		BASTET_LOGE("sk: %p state: %d not expected", sk, bsk->bastet_sock_state);
		return;
	}

	/* Sock owner has used since last setup */
	if (time_after(bsk->last_sock_active_time_point + bsk->delay_sync_time_section, jiffies)) {
		setup_sock_sync_delay_timer(sk);
		return;
	}

	/* Sock owner has some data unacked,
	 * Coming ack would trigger delay timer again */
	if (!tcp_write_queue_empty(sk)) {
		BASTET_LOGI("sk: %p has sent data not acked", sk);
		post_indicate_packet(BST_IND_TRIGGER_THAW, &bsk->pid, sizeof(pid_t));
		return;
	}

	/* Sock owner has some data to recv, do not sync.
	 * If sock owner has none recv action,
	 * delay timer should be stopped. */
	if (!skb_queue_empty(&sk->sk_receive_queue)) {
		BASTET_LOGI("sk: %p has received data in queue", sk);
		bsk->last_sock_active_time_point = jiffies;
		setup_sock_sync_delay_timer(sk);
		post_indicate_packet(BST_IND_TRIGGER_THAW, &bsk->pid, sizeof(pid_t));
		return;
	}

	memset(&sock_p, 0, sizeof(struct bst_set_sock_sync_prop));
	bastet_get_comm_prop(sk, &sock_p.guide);
	bastet_get_sock_prop(sk, &sock_p.sync_prop);

	err = post_indicate_packet(BST_IND_SOCK_SYNC_PROP, &sock_p, sizeof(sock_p));
	if (!err) {
		/* if post success */
		bsk->bastet_sock_state = BST_SOCK_INVALID;
	}
}