summaryrefslogtreecommitdiff
path: root/apps/examples/netpkt/netpkt_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/examples/netpkt/netpkt_main.c')
-rw-r--r--apps/examples/netpkt/netpkt_main.c258
1 files changed, 258 insertions, 0 deletions
diff --git a/apps/examples/netpkt/netpkt_main.c b/apps/examples/netpkt/netpkt_main.c
new file mode 100644
index 000000000..b833a4a14
--- /dev/null
+++ b/apps/examples/netpkt/netpkt_main.c
@@ -0,0 +1,258 @@
+/****************************************************************************
+ * net/recvfrom.c
+ *
+ * Copyright (C) 2014 Gregory Nutt. All rights reserved.
+ * Author: Lazlo <dlsitzer@gmail.comg>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <netpacket/packet.h>
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: psock_create
+ ****************************************************************************/
+
+static int psock_create(void)
+{
+ int sd;
+ struct sockaddr_ll addr;
+ int addrlen = sizeof(addr);
+
+ sd = socket(AF_PACKET, SOCK_RAW, 0);
+ if (sd < 0)
+ {
+ perror("ERROR: failed to create packet socket");
+ return -1;
+ }
+
+ /* Prepare sockaddr struct */
+
+ addr.sll_family = AF_PACKET;
+ addr.sll_ifindex = 0;
+ if (bind(sd, (const struct sockaddr *)&addr, addrlen) < 0)
+ {
+ perror("ERROR: binding socket failed");
+ close(sd);
+ return -1;
+ }
+
+ return sd;
+}
+
+/****************************************************************************
+ * Name: print_buf
+ ****************************************************************************/
+
+static void print_buf(const uint8_t *buf, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ {
+ printf("%02X", buf[i]);
+
+ if ((i+1) % 16 == 0 || (i+1) == len)
+ {
+ printf("\n");
+ }
+ else if ((i+1) % 8 == 0)
+ {
+ printf(" ");
+ }
+ else
+ {
+ printf(" ");
+ }
+ }
+}
+
+/****************************************************************************
+ * Name: netpkt_usage
+ ****************************************************************************/
+
+static void netpkt_usage(void)
+{
+ printf("usage: netpkt options\n");
+ printf("\n");
+ printf(" -a transmit and receive\n");
+ printf(" -r receive\n");
+ printf(" -t transmit\n");
+ printf(" -v verbose\n");
+ printf("\n");
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: netpkt_main
+ ****************************************************************************/
+
+int netpkt_main(int argc, char **argv)
+{
+ int sd;
+ int i;
+ int txc;
+ int rxc;
+ uint8_t *buf;
+ const int buflen = 128;
+ const char da[6] = {0xf0, 0xde, 0xf1, 0x02, 0x43, 0x01};
+ const char sa[6] = {0x00, 0xe0, 0xde, 0xad, 0xbe, 0xef};
+
+ int opt;
+ int verbose = 0;
+ int do_rx = 0;
+ int do_rxtimes = 3;
+ int do_tx = 0;
+ int do_txtimes = 3;
+
+ if (argc == 1)
+ {
+ netpkt_usage();
+ return -1;
+ }
+
+ /* Parse arguments */
+
+ while ((opt = getopt(argc, argv, "artv")) != -1)
+ {
+ switch(opt)
+ {
+ case 'a':
+ do_rx = 1;
+ do_tx = 1;
+ break;
+
+ case 'r':
+ do_rx = 1;
+ break;
+
+ case 't':
+ do_tx = 1;
+ break;
+
+ case 'v':
+ verbose = 1;
+ break;
+
+ default:
+ netpkt_usage();
+ return -1;
+ }
+ }
+
+ sd = psock_create();
+
+ if (do_tx)
+ {
+ if (verbose)
+ {
+ printf("Testing write() (%d times)\n", do_txtimes);
+ }
+
+ buf = malloc(buflen);
+ memset(buf, 0, buflen);
+ memcpy(buf, da, 6);
+ memcpy(buf+6, sa, 6);
+ for (i = 0; i < do_txtimes; i++)
+ {
+ if ((txc = write(sd, buf, buflen)) < 0)
+ {
+ perror("ERROR: write failed");
+ free(buf);
+ close(sd);
+ return -1;
+ }
+ else
+ {
+ if (verbose)
+ {
+ printf("transmited %d octets\n", txc);
+ print_buf(buf, txc);
+ }
+ }
+ }
+
+ free(buf);
+ }
+
+ if (do_rx)
+ {
+ if (verbose)
+ {
+ printf("Testing read() (%d times)\n", do_rxtimes);
+ }
+
+ buf = malloc(buflen);
+ memset(buf, 0, buflen);
+ for (i = 0; i < do_rxtimes; i++)
+ {
+ rxc = read(sd, buf, buflen);
+ if (rxc < 0)
+ {
+ perror("ERROR: read failed");
+ free(buf);
+ close(sd);
+ return -1;
+ }
+ else if (rxc == 0)
+ {
+ /* ignore silently */
+ }
+ else
+ {
+ if (verbose)
+ {
+ printf("received %d octets\n", rxc);
+ print_buf(buf, rxc);
+ }
+ }
+ }
+
+ free(buf);
+ }
+
+ close(sd);
+ return 0;
+}