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