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