Пример #1
0
	static void recv_handler(struct sk_buff *__skb)
	{
		struct sk_buff * skb = NULL;		//socket buffer
		struct nlmsghdr * nlhdr = NULL;		//netlink message header
		struct cn_msg * cmsg = NULL;		//netlink connector message
		struct w1_netlink_msg * w1msg = NULL;		//w1 netlink message
		struct w1_netlink_cmd * w1cmd = NULL;		//w1 netlink command

		int minSize = sizeof(struct nlmsghdr) + sizeof(struct cn_msg)
				+ sizeof(struct w1_netlink_msg) + sizeof(struct w1_netlink_cmd);

		int len;

		//must be done here:
		skb = skb_get(__skb);

		nlhdr = (struct nlmsghdr *)skb->data;
		if (nlhdr->nlmsg_len < minSize)
		{
			printk("Corrupt w1 netlink message.\n");
			return;
		}

		len = nlhdr->nlmsg_len - NLMSG_LENGTH(0);
		printk("Got a netlink msg, it's length is %d.\n", len);

		cmsg = NLMSG_DATA(nlhdr);
		on_w1_msg_received(cmsg);
	}
void socketmsg_receiving_loop(void * param)
{
	int ret;

	printf("w1 socketmsg receiving thread started!\n");

	while(!receivingThreadStopFlag)
	{
		ret = retrieve_socket_msg(&socketMsgRecv);

		if (E_SOCKET_PEER_GONE == ret) {
			printf("System error, socket peer is gone, application exit.\n");
			exit(0);
		}
		else if (E_SOCKET_CANNOT_RECV == ret) {
			perror("recvmsg error...");
			exit(1);
		}
		else
		{
			//base on the ret size...
			on_w1_msg_received((struct cn_msg *)NLMSG_DATA(nlhdr));
		}
	}

	printf("w1 socketmsg receiving thread stopped!\n");
}
Пример #3
0
int main(void)
{
	struct cn_msg * cmsg;
	struct w1_netlink_msg * msg;
	struct w1_netlink_cmd * cmd;
	int ret;

	nlMsgSend = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_MSGSIZE));
	nlMsgRecv = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_MSGSIZE));
	if (nlMsgSend == NULL || nlMsgRecv == NULL)
	{
		perror("Cannot allocate memory for netlink message header!");
		exit(-1);
	}
	memset(nlMsgSend, 0, NLMSG_SPACE(MAX_MSGSIZE));
	memset(nlMsgRecv, 0, NLMSG_SPACE(MAX_MSGSIZE));


	addrRemote.nl_family = AF_NETLINK;
    addrRemote.nl_pid = 0;
    addrRemote.nl_groups = CN_IDX_W1;

	sd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);

	addrLocal.nl_family = AF_NETLINK;
	addrLocal.nl_groups = CN_IDX_PROC;
	addrLocal.nl_pid = getpid();

	if (bind(sd, (struct sockaddr *)&addrLocal, sizeof(struct sockaddr_nl)) == -1) {
		perror("bind");
		close(sd);
		return -1;
	}


	while (1)
	{
		ret = retrieve_w1_msg(&socketMsgRecv);

		if (ret == 0) {
			printf("Exit.\n");
			exit(0);
		}
		else if (ret == -1) {
			perror("recvmsg:");
			exit(1);
		}
		else
		{
			on_w1_msg_received((struct cn_msg *)NLMSG_DATA(nlhdr));
		}

	}
}
Пример #4
0
static int process_message_thread(void * data)
{
	struct sk_buff * skb = NULL;			//socket buffer
	struct nlmsghdr * nlhdr = NULL;			//netlink message header
	struct cn_msg * cmsg = NULL;			//netlink connector message
	struct w1_netlink_msg * w1msg = NULL;	//w1 netlink message
	struct w1_netlink_cmd * w1cmd = NULL;	//w1 netlink command

	int minSize = sizeof(struct nlmsghdr) + sizeof(struct cn_msg)
			+ sizeof(struct w1_netlink_msg) + sizeof(struct w1_netlink_cmd);

	int len;

	DEFINE_WAIT(wait);

	daemonize("w1_kernapp");

	while (exit_flag == 0)
	{
		prepare_to_wait(netlink_w1_sock->sk_sleep, &wait, TASK_INTERRUPTIBLE);
		schedule();
		finish_wait(netlink_w1_sock->sk_sleep, &wait);

		while ( (skb = skb_dequeue(&netlink_w1_sock->sk_receive_queue)) != NULL )
		{
			nlhdr = (struct nlmsghdr *)skb->data;
			if (nlhdr->nlmsg_len < minSize)
			{
				printk("Corrupt w1 netlink message.\n");
				continue;
			}

			len = nlhdr->nlmsg_len - NLMSG_LENGTH(0);
			printk("Got a netlink msg, it's length is %d.\n", len);

			cmsg = NLMSG_DATA(nlhdr);
			on_w1_msg_received(cmsg);

			/*
			nlhdr->nlmsg_pid = 0;
			nlhdr->nlmsg_flags = 0;
			NETLINK_CB(skb).pid = 0;
			NETLINK_CB(skb).dst_pid = 0;
			NETLINK_CB(skb).dst_group = 1;

			netlink_broadcast(netlink_w1_sock, skb, 0, 1, GFP_KERNEL);
			*/
		}
	}
	complete(&exit_completion);
	return 0;
}