int rttm_recv(void *buf, u32 len)
{
#define RTTM_CONTEXT_PREFIX_OFFSET \
	(sizeof(u32) + sizeof(u32) + sizeof(struct ath6kl *))

	struct rttm_context *prttm = NULL;
	struct nsp_mresphdr *presphdr = (struct nsp_mresphdr *)buf;
	int resptype = presphdr->response_type;
	prttm = DEV_GETRTT_HDL();

	/* printk("RTT Recv Len : %d %d\n", len, resptype); */
	if ((resptype == MRESP_CLKOFFSETCAL_START) ||
		(resptype == MRESP_CLKOFFSETCAL_END)) {
		ath6kl_dbg(ATH6KL_DBG_RTT,
				"RTT ClkCal Request %d\n", resptype);
		if (resptype == MRESP_CLKOFFSETCAL_START) {
			prttm->rttdhclkcal_active = 1;
			prttm->dhclkcal_index = 0;
		} else if (resptype == MRESP_CLKOFFSETCAL_END) {
			prttm->rttdhclkcal_active = 0;
			prttm->dhclkcal_index = 0;
			/* Post Response of measurements to Device */
			prttm->mresphdr.frame_type = NSP_RTTCLKCAL_INFO;
			rttm_issue_request(
				(char *)prttm + RTTM_CONTEXT_PREFIX_OFFSET,
				NSP_HDR_LEN + sizeof(struct nsp_rtt_clkoffset));
		}

	} else {
		if (buf && len)	{
			/* Pass up Recv RTT Resp by NL */
			/* DumpRttResp(buf); */
			ath6kl_dbg(ATH6KL_DBG_RTT, "NLSend  Len : %d ", len);
			ath_netlink_send(buf, len);
		}
	}
	return 0;
}
Exemple #2
0
/* Receive messages from netlink socket. */
static void ath_netlink_receive(struct sk_buff *__skb)
{
	struct sk_buff *skb = NULL;
	struct nlmsghdr *nlh = NULL;
	u_int8_t *data = NULL;
	u_int32_t uid, pid, seq;

	skb = skb_get(__skb);
	if (skb) {
		/* process netlink message pointed by skb->data */
		nlh = (struct nlmsghdr *)skb->data;
		pid = NETLINK_CREDS(skb)->pid;
		pid = nlh->nlmsg_pid;
		uid = NETLINK_CREDS(skb)->uid;
		seq = nlh->nlmsg_seq;
		data = NLMSG_DATA(nlh);

		gpid = pid;
		ath_netlink_reply(pid, seq, data);
		rttm_issue_request(data, nlmsg_len(nlh));
		kfree_skb(skb);
	}
	return ;
}