[Regression 2.6.37->2.6.38] pnxmit.c, test program

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



$ pnxmit -a 0x10 -s 0x6c # send from host 0x10 to device 0x6c
$ pnxmit -a 0x6c -r # on the device, receive

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx>
Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx>
---
/*
 * Test program for phonet
 *
 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

/*
 * TODO:
 *
 * Many values (e.g. object IDs) are hardcoded. Convert them into
 * proper commandline parameters.
 *
 */

#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <getopt.h>
#include <limits.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/phonet.h>
#include <linux/if_ether.h>


#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

#define exit_error(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
#define do_exit(...)	do { fprintf(stderr, __VA_ARGS__); } while (0)

/*
struct sockaddr_pn {
	sa_family_t	spn_family;    // AF_PHONET
	uint8_t		spn_obj;       // Object ID
	uint8_t		spn_dev;       // Device ID
	uint8_t		spn_resource;  // Resource or function
	uint8_t		spn_zero[...]; // Padding
};

struct phonethdr {
	uint8_t  	pn_media;  // Media type (link-layer identifier)
	uint8_t  	pn_rdev;   // Receiver device ID
	uint8_t  	pn_sdev;   // Sender device ID
	uint8_t  	pn_res;    // Resource ID or function
	uint16_t 	pn_length; // Big-endian message byte length (minus 6)
	uint8_t  	pn_robj;   // Receiver object ID
	uint8_t  	pn_sobj;   // Sender object ID
};
*/

static void usage(char *prog)
{
	fprintf(stderr, "Usage: %s\n"
		"	--address=<n>, -a <n>	use this local address\n"
		"	--send=<n>, -s <n>	send data to <n>\n"
		"	--receive, -r		receive data\n"
		"	--help, -h		this help\n", prog);
}

static struct option pnxmit_opts[] = {
	{
		.name		= "address",
		.has_arg	= 1,
		.val		= 'a',
	},
	{
		.name		= "send",
		.has_arg	= 1,
		.val		= 's',
	},
	{
		.name		= "receive",
		.val		= 'r',
	},
	{
		.name		= "help",
		.val		= 'h',
	},
	{
		.name		= '\0',
	},
};

int get_addr(const char *optarg)
{
	long int val;

	val = strtol(optarg, NULL, 0);
	if (val == LONG_MIN || val == LONG_MAX || val < 0 || val > INT_MAX)
		do_exit("value %ld out of range", val);
	

	return (uint8_t)val;
}

int main(int argc, char *argv[])
{
	static struct sockaddr_pn local_addr = {
		.spn_family	= AF_PHONET,
		.spn_obj	= 0xab,
		.spn_resource	= 0xee,
	};
	static struct sockaddr_pn remote_addr = {
		.spn_family	= AF_PHONET,
		.spn_obj	= 0xab,
		.spn_resource	= 0xee,
	};
	static struct my_msg {
		struct phonethdr phonet_msg;
		char data[256];
	} phonet_msg;
	ssize_t len;
	socklen_t addrlen = sizeof(remote_addr);
	bool receive = false;
	int res = 1;
	int fd;

	while (ARRAY_SIZE(pnxmit_opts)) {
		int optidx = 0;
		int opt;

		opt = getopt_long(argc, argv, "a:s:rh", pnxmit_opts, &optidx);
		if (opt < 0)
			break;

		switch (opt) {
		case 'a':
			local_addr.spn_dev = get_addr(optarg);
			phonet_msg.phonet_msg.pn_sdev = local_addr.spn_dev;
			break;
		case 's':
			remote_addr.spn_dev = get_addr(optarg);
			phonet_msg.phonet_msg.pn_rdev = remote_addr.spn_dev;
			break;
		case 'r':
			receive = true;
			break;
		case 'h': /* intentional */
		default:
			usage(argv[0]);
			return 1;
		}
	}

	fd = socket(PF_PHONET, SOCK_DGRAM, 0);
	if (fd == -1)
		exit_error("socket");
	if (bind(fd, (struct sockaddr*)&local_addr, sizeof(local_addr)))
		exit_error("bind");
	
	/*if (ioctl(fd, SIOCPNADDRESOURCE, &res) < 0)
		exit_error("ioctl");*/

	phonet_msg.phonet_msg.pn_res = 0xee;
	phonet_msg.phonet_msg.pn_robj = 0xab;
	phonet_msg.phonet_msg.pn_sobj = 0xab;
	if (receive) {
		len = recvfrom(fd, (char*)&phonet_msg, sizeof(phonet_msg), 0,
			(struct sockaddr *)&remote_addr, &addrlen);
		if (len < 0)
			exit_error("recvfrom");
		printf("Received %d bytes from %02x%02x\n", len,
			remote_addr.spn_dev, remote_addr.spn_obj);
	} else {
		len = sendto(fd, (char*)&phonet_msg, sizeof(phonet_msg), 0,
			(struct sockaddr *)&remote_addr, sizeof(remote_addr));
		if (len < 0)
			exit_error("sendto");
		printf("Sent %d bytes to %02x%02x\n", len,
			remote_addr.spn_dev, remote_addr.spn_obj);
	}

	return 0;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux