Project Home
Project Home
Wiki
Wiki
Discussion Forums
Discussions
Project Information
Project Info
Forum Topic - Buffer handling within an io-pkt transmit routine: (23 Items)
   
Buffer handling within an io-pkt transmit routine  
Firstly pardon my lack of knowledge on this subject. I am attempting to write my first io-pkt driver, I have written 
some io-net drivers a number of years ago (10). I have looked at the sam example code and my driver appears to be 
mounted under io-pkt. I am having some problems with the transmit routine. 

The hardware is in effect a SLIP interface, I am attempting to port from another well know RTOS towards QNX. On the 
other RTOS I registered the driver as an Ethernet Interface and then in the Transmit routine jump over the Ethernet 
Header. The hardware does not support DMA so the packet needs to be copied into a memory mapped transmit buffer. I was 
hoping to be able to do the same under QNX.

I appear to have got some way towards this; the transmit routine is called but I am unable to successfully transmit the 
mbuf data to the transmit buffer. I am however able to transmit a hardcoded buffer containing an ICMP echo request 
packet. I de-fragment the received mbuf and have attempt to copy the packet into the transmit buffer using memcpy or 
m_copydata without success.

Any help gratefully received.
Re: Buffer handling within an io-pkt transmit routine  
m_copydata() is the right way to go, it copies data from an mbuf chain starting "off" bytes from the beginning, 
continuing for "len" bytes, into the indicated buffer. Note that in Tx you are likely to get the data in an mbuf chain, 
the dequeue will give you the first mbuf of the chain so you will need to walk the chain - that's why m_copydata() is so
 nice as it walks the complete chain for you.

Have you tried also copying to just a static buffer and then printing that out? Can you share some code snippets?
Re: Buffer handling within an io-pkt transmit routine  
 
Many thanks for the reply

So the following works

{
   uint8_t  test[] = {0x45,0x00,0x00,0x2e,0x7b,0x3a,0x00,0x00,0x3f,0x11,0x7b,0xb3,0xc0,0xa8,0x01,0x82,0xc0,0xa8,0x01,
0xff,0x1d,0x76,0x1d,0x76,0x00,0x1a,0xee,0x6c,0x20,0x8f,0x61,0x00,0x20,0x00,0x00,0xa5,0x07,0xb0,0xe0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00};
   memcpy(register_configuration->transmit_buffer, test, sizeof(test));
   *(register_configuration->transmit_length_register) = sizeof(test);
   *(register_configuration->transmit_control_register) = TRANSMITTER_START;
}

What I was trying was

{
   uint8_t ethernet_media_access_control_address[] = {0x57, 0x20, 0x48, 0x4F, 0x45, 0x59, 0x57, 0x20, 0x48, 0x5F, 0x55, 
0x69, 0x08, 0x00};
   m_copydata(m, sizeof(ethernet_media_access_control_address), ((m->m_pkthdr.len)-
(sizeof(ethernet_media_access_control_address))), register_configuration->transmit_buffer);
   *(register_configuration->transmit_length_register) = ((m->m_pkthdr.len)-
(sizeof(ethernet_media_access_control_address)));
   *(register_configuration->transmit_control_register) = TRANSMITTER_START;
}

I am currently trying to print the packet in some nicely formatted way, for some reason any printf call with formatting 
arguments appear to end up in the slog.
Re: Buffer handling within an io-pkt transmit routine  
fprintf won't go to slog.

Sent from my BlackBerry 10 smartphone on the Rogers network.
  Original Message
From: William Hoey
Sent: Wednesday, February 18, 2015 3:22 PM
To: drivers-networking
Reply To: drivers-networking@community.qnx.com
Subject: Re: Buffer handling within an io-pkt transmit routine


Many thanks for the reply

So the following works

{
   uint8_t  test[] = {0x45,0x00,0x00,0x2e,0x7b,0x3a,0x00,0x00,0x3f,0x11,0x7b,0xb3,0xc0,0xa8,0x01,0x82,0xc0,0xa8,0x01,
0xff,0x1d,0x76,0x1d,0x76,0x00,0x1a,0xee,0x6c,0x20,0x8f,0x61,0x00,0x20,0x00,0x00,0xa5,0x07,0xb0,0xe0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00};
   memcpy(register_configuration->transmit_buffer, test, sizeof(test));
   *(register_configuration->transmit_length_register) = sizeof(test);
   *(register_configuration->transmit_control_register) = TRANSMITTER_START;
}

What I was trying was

{
   uint8_t ethernet_media_access_control_address[] = {0x57, 0x20, 0x48, 0x4F, 0x45, 0x59, 0x57, 0x20, 0x48, 0x5F, 0x55, 
0x69, 0x08, 0x00};
   m_copydata(m, sizeof(ethernet_media_access_control_address), ((m->m_pkthdr.len)-
(sizeof(ethernet_media_access_control_address))), register_configuration->transmit_buffer);
   *(register_configuration->transmit_length_register) = ((m->m_pkthdr.len)-
(sizeof(ethernet_media_access_control_address)));
   *(register_configuration->transmit_control_register) = TRANSMITTER_START;
}

I am currently trying to print the packet in some nicely formatted way, for some reason any printf call with formatting 
arguments appear to end up in the slog.



_______________________________________________

Networking Drivers
http://community.qnx.com/sf/go/post113331
To cancel your subscription to this discussion, please e-mail drivers-networking-unsubscribe@community.qnx.com
Re: Buffer handling within an io-pkt transmit routine  
A dump of the packet sent when I set the IP address with ifconfig gives the following:

ff ff ff ff ff ff 57 20 48 4f 45 59 08 06 00 01 
08 00 06 04 00 01 57 20 48 4f 45 59 c0 a8 01 82 
00 00 00 00

Which I think is a correctly formatted ARP packet.
Re: Buffer handling within an io-pkt transmit routine  
What's the CPU and how does it behave in terms of strongly or weakly ordered memory? Presumably all those register 
configuration pointers are volatile so the compiler shouldn't reorder them?
Re: Buffer handling within an io-pkt transmit routine  
The CPU is an PowerPC 750 variant and all the registers are defined as volatile. 
Re: Buffer handling within an io-pkt transmit routine  
On PowerPC I think you need to add some "eioio" instructions to act as barriers and prevent it reordering accesses.
Re: Buffer handling within an io-pkt transmit routine  
Armed with Sean's advice with regards to using fprint I think I have a better handle on what is going on.

I suspect that the transmit routine is working correctly, the first packet is ARP packet which is not forwarded by the 
router on the other end of the SLIP interface. 

Could the issue be related to how the device is registered with io-pkt?

The IP stack on the other RTOS only supports ethernet, so the drivers registers as an ethernet driver and sets the 
following flags during initialisation:

xxxFlagSet(&network_device_configuration->end, IFF_POINTOPOINT | IFF_NOARP | IFF_SIMPLEX | IFF_BROADCAST | IFF_UP | IFF_RUNNING);

Under QNX in the attach routine I set the following flags:

ifp->if_flags = IFF_POINTOPOINT | IFF_NOARP | IFF_SIMPLEX | IFF_BROADCAST;

I then set the IFF_RUNNING runnnig in the initialisation routine.

I suspect I need to do a little bit more under io-pkt as ifconfig gives the following:

Other RTOS:

lo0     Link type:Local loopback  Queue:none
        inet 127.0.0.1  mask 255.255.255.255
        UP RUNNING LOOPBACK MULTICAST NOARP ALLMULTI
        MTU:1500  metric:1  VR:0  ifindex:1
        RX packets:203 mcast:0 errors:0 dropped:0
        TX packets:203 mcast:0 errors:0
        collisions:0 unsupported proto:0
        RX bytes:217k  TX bytes:217k

fr0     Link type:1  HWaddr 57:20:48:4f:45:59  Queue:none
        inet 192.168.1.130  mask 255.255.255.0  broadcast 192.168.1.255
        UP RUNNING SIMPLEX BROADCAST NOARP
        MTU:1500  metric:1  VR:0  ifindex:2
        RX packets:376 mcast:0 errors:0 dropped:0
        TX packets:158 mcast:0 errors:0
        collisions:0 unsupported proto:0
        RX bytes:39k  TX bytes:137k

QNX

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192
        inet 127.0.0.1 netmask 0xff000000
fr0: flags=88d3<UP,BROADCAST, RUNNING,NOARP,SIMPLEX > mtu 1500
        address: 57:20:48:4f:45:59
        media: Ethernet none
        inet 192.168.1.130 -> 192.168.1.255 netmask 0xffffff00 broadcast 192.168.1.255

On this piece of hardware the link is always available and there is no phy or link management required, is it possible 
under io-pkt to simply hard code the link to be 10BaseT Full Duplex always UP? or can io-pkt support a SLIP interface 
(as this would avoid the need for the network driver to add and remove the Ethernet Header)?

Many Thanks Again.
Re: Buffer handling within an io-pkt transmit routine  
We do actually have lsm-slip.so to support SLIP. In this we set:

	sc->sc_if.if_flags = IFF_POINTOPOINT | SC_AUTOCOMP | IFF_MULTICAST;
	sc->sc_if.if_type = IFT_SLIP;

And then we if_attach() but we do NOT ether_ifattach()
Re: Buffer handling within an io-pkt transmit routine  
Many thanks again; I am hoping that this will resolve my problems;

I have having some problems resolving the SC_AUTOCOMP definition.

With regard to the nic_config_t configuration I was considering the following:

network_device_configuration->nic_config.num_irqs = 1;
network_device_configuration->nic_config.irq[0]     = IRQ_FOUR

network_device_configuration->nic_config.priority   = IRUPT_PRIO_DEFAULT;
network_device_configuration->nic_config.lan        = network_device_configuration->dev.dv_unit;
network_device_configuration->nic_config.iftype     = IFT_SLIP;

network_device_configuration->nic_config.media      = NIC_MEDIA_CUSTOM;
network_device_configuration->nic_config.mtu        = ETH_MAX_PKT_LEN;
network_device_configuration->nic_config.mru        = ETH_MAX_PKT_LEN;
network_device_configuration->nic_config.mac_length = 0;

network_device_configuration->nic_stats.media       = network_device_configuration->nic_config.media;  

But I am unclear if this is required.
Re: Buffer handling within an io-pkt transmit routine  
Sorry about that, SC_AUTOCOMP is mapped through to IFF_LINK2 and is just used to flag auto-enable of the SLIP 
compression.

The nic_config_t is more used my nicinfo which sends a SIOCGDRVCOM ioctl for DRVCOM_CONFIG and expects the nic_config_t.
 You may not need to support this, although it is a nice way to dump out many of the internals. What you have looks 
reasonable at a quick glance.
Re: Buffer handling within an io-pkt transmit routine  
Can I ask is the source for lsm-slip.so publicly available?

When I set the  IFF_POINTOPOINT | IFF_LINK2 | IFF_MULTICAST flags I get the following when I attempt to assign an IP 
address.

ifconfig: SIOCAIFADDR: No such process 

So more work required.

SLIP does feel like the best fit but I am wondering if an ethernet driver with the link hardcoded to 10BaseT Full Duplex
 is the path of least resistance (this is what was necessary on the original RTOS) also the hardware can be configured 
to automatically add and remove an ethernet header (however this is currently done in the driver but can be off loaded 
to the hardware if necessary). Is it possible to effectively hard code the link configuration and remove the MII status 
detection under io-pkt?
Re: Buffer handling within an io-pkt transmit routine  
lsm-slip.so source code is not publicly available but may be available to you as part of your support contract.

It's perfectly possible to just not hookup the MII code for an Ethernet driver. See the dm814x driver published in 
source code form in the J5 and J6 BSPs - when built with SWITCHMODE defined then it avoids the MII configuration and 
just configures the MAC speed and duplex based on the command line option.
Re: Buffer handling within an io-pkt transmit routine  
Nick,

Many thanks for all your help, I think I understand what is going on however not how to fix it.

On the current RTOS I set the following Interface Flags:

IFF_POINTOPOINT | IFF_NOARP | IFF_SIMPLEX | IFF_BROADCAST

However under QNX if I set the IFF_NOARP flag I do not get the behaviour that I was hoping for.

Currently I print each packet in the Network Transmit routine, I have include this debug below.

When I assigned an IP address to the interface starts an ARP packet is transmitted.

# ifconfig fr0 192.168.1.130
HDLC Transmit Packet Length 42
0000  ff ff ff ff ff ff 57 20  48 4f 45 59 08 06 00 01
000f  08 00 06 04 00 01 57 20  48 4f 45 59 c0 a8 01 82
001f  00 00 00 00 00 00 c0 a8  01 82

# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192
        inet 127.0.0.1 netmask 0xff000000
fr0: flags=8d3<UP,BROADCAST,POINTOPOINT,RUNNING,NOARP,SIMPLEX> mtu 1500
        address: 57:20:48:4f:45:59
        media: Ethernet 10baseT full-duplex (<unknown subtype> full-duplex)
        inet 192.168.1.130 -> 192.168.1.255 netmask 0xffffff00 broadcast 192.168.1.255


If I attempt to ping a target on the network no packet is sent.

# ping -c1 192.168.1.54
PING 192.168.1.54 (192.168.1.54): 56 data bytes

----192.168.1.54 PING Statistics----
1 packets transmitted, 0 packets received, 100% packet loss

However if I manually add an ARP entry for the IP address and attempt to ping the packet is successfully transmitted on 
the network.

# arp -s 192.168.1.54 00:67:54:34:35:17 fr0
# ping -c1 192.168.1.54
PING 192.168.1.54 (192.168.1.54): 56 data bytes
HDLC Transmit Packet Length 98
0000  00 67 54 34 35 17 57 20  48 4f 45 59 08 00 45 00
000f  00 54 00 19 00 00 ff 01  37 87 c0 a8 01 82 c0 a8
001f  01 36 08 00 96 43 90 07  00 00 00 00 00 7f 00 02
002f  e6 30 08 09 0a 0b 0c 0d  0e 0f 10 11 12 13 14 15
003f  16 17 18 19 1a 1b 1c 1d  1e 1f 20 21 22 23 24 25
004f  26 27 28 29 2a 2b 2c 2d  2e 2f 30 31 32 33 34 35
005f  36 37

Re: Buffer handling within an io-pkt transmit routine  
Make sure you're not calling ether_ifattach().

On Fri, Feb 20, 2015 at 08:56:00AM -0500, William Hoey wrote:
> Nick,
> 
> Many thanks for all your help, I think I understand what is going on however not how to fix it.
> 
> On the current RTOS I set the following Interface Flags:
> 
> IFF_POINTOPOINT | IFF_NOARP | IFF_SIMPLEX | IFF_BROADCAST
> 
> However under QNX if I set the IFF_NOARP flag I do not get the behaviour that I was hoping for.
> 
> Currently I print each packet in the Network Transmit routine, I have include this debug below.
> 
> When I assigned an IP address to the interface starts an ARP packet is transmitted.
> 
> # ifconfig fr0 192.168.1.130
> HDLC Transmit Packet Length 42
> 0000  ff ff ff ff ff ff 57 20  48 4f 45 59 08 06 00 01
> 000f  08 00 06 04 00 01 57 20  48 4f 45 59 c0 a8 01 82
> 001f  00 00 00 00 00 00 c0 a8  01 82
> 
> # ifconfig
> lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192
>         inet 127.0.0.1 netmask 0xff000000
> fr0: flags=8d3<UP,BROADCAST,POINTOPOINT,RUNNING,NOARP,SIMPLEX> mtu 1500
>         address: 57:20:48:4f:45:59
>         media: Ethernet 10baseT full-duplex (<unknown subtype> full-duplex)
>         inet 192.168.1.130 -> 192.168.1.255 netmask 0xffffff00 broadcast 192.168.1.255
> 
> 
> If I attempt to ping a target on the network no packet is sent.
> 
> # ping -c1 192.168.1.54
> PING 192.168.1.54 (192.168.1.54): 56 data bytes
> 
> ----192.168.1.54 PING Statistics----
> 1 packets transmitted, 0 packets received, 100% packet loss
> 
> However if I manually add an ARP entry for the IP address and attempt to ping the packet is successfully transmitted 
on the network.
> 
> # arp -s 192.168.1.54 00:67:54:34:35:17 fr0
> # ping -c1 192.168.1.54
> PING 192.168.1.54 (192.168.1.54): 56 data bytes
> HDLC Transmit Packet Length 98
> 0000  00 67 54 34 35 17 57 20  48 4f 45 59 08 00 45 00
> 000f  00 54 00 19 00 00 ff 01  37 87 c0 a8 01 82 c0 a8
> 001f  01 36 08 00 96 43 90 07  00 00 00 00 00 7f 00 02
> 002f  e6 30 08 09 0a 0b 0c 0d  0e 0f 10 11 12 13 14 15
> 003f  16 17 18 19 1a 1b 1c 1d  1e 1f 20 21 22 23 24 25
> 004f  26 27 28 29 2a 2b 2c 2d  2e 2f 30 31 32 33 34 35
> 005f  36 37
> 
> 
> 
> 
> 
> _______________________________________________
> 
> Networking Drivers
> http://community.qnx.com/sf/go/post113351
> To cancel your subscription to this discussion, please e-mail drivers-networking-unsubscribe@community.qnx.com
Re: Buffer handling within an io-pkt transmit routine  
I am clearly missing something very obvious (sorry about that) I tried removing the call to ether_ifattach that results 
in the following when I attempt to assign an IP address.

ifconfig: SIOCAIFADDR: No such process

Re: Buffer handling within an io-pkt transmit routine  
Sounds like io-pkt is faulting; maybe in your driver. Looking at the core file with the debugger or running io-pkt in 
the debugger should give more info.

Sent from my BlackBerry 10 smartphone on the Rogers network.
  Original Message
From: William Hoey
Sent: Friday, February 20, 2015 9:27 AM
To: drivers-networking
Reply To: drivers-networking@community.qnx.com
Subject: Re: Buffer handling within an io-pkt transmit routine


I am clearly missing something very obvious (sorry about that) I tried removing the call to ether_ifattach that results 
in the following when I attempt to assign an IP address.

ifconfig: SIOCAIFADDR: No such process





_______________________________________________

Networking Drivers
http://community.qnx.com/sf/go/post113353
To cancel your subscription to this discussion, please e-mail drivers-networking-unsubscribe@community.qnx.com
Re: Buffer handling within an io-pkt transmit routine  
Apart from the serial port this network driver is the only way into the board.

What appears to happen is if ether_ifattach is not called io-pkt terminates either setting or getting the interface 
address


 io-pkt-v4 -dnetwork-device
# pidin
     pid tid name               prio STATE       Blocked
       1   1 procnto-600_exp508   0f READY
       1   2 procnto-600_exp508 255r RECEIVE     1
       1   3 procnto-600_exp508 255r RECEIVE     1
       1   4 procnto-600_exp508  11r RECEIVE     1
       1   5 procnto-600_exp508 255r RECEIVE     1
       1   6 procnto-600_exp508  10r RUNNING
       1   7 procnto-600_exp508  10r RECEIVE     1
       1   8 procnto-600_exp508  10r RECEIVE     1
       1   9 procnto-600_exp508  10r RECEIVE     1
       1  10 procnto-600_exp508  10r RECEIVE     1
       1  11 procnto-600_exp508  10r RECEIVE     1
       2   1 proc/boot/slogger   21r RECEIVE     1
       3   1 proc/boot/pipe      10r SIGWAITINFO
       3   2 proc/boot/pipe      10r RECEIVE     1
       3   3 proc/boot/pipe      10r RECEIVE     1
       4   1 proc/boot/devc-pty  10r RECEIVE     1
       5   1 proc/boot/ksh       10r SIGSUSPEND
       6   1 roc/boot/io-pkt-v4  21r SIGWAITINFO
       6   2 roc/boot/io-pkt-v4  21r RECEIVE     1
    4103   1 proc/boot/pidin     10r REPLY       1
# ifconfig fr0 192.168.1.130
Entered Function Network Device IOCTL -2138019572
Exit Function Network Device IOCTL
Entered Function Network Device IOCTL -2138019568
Exit Function Network Device IOCTL
# pidin
     pid tid name               prio STATE       Blocked
       1   1 procnto-600_exp508   0f READY
       1   2 procnto-600_exp508 255r RECEIVE     1
       1   3 procnto-600_exp508 255r RECEIVE     1
       1   4 procnto-600_exp508  10r RUNNING
       1   5 procnto-600_exp508 255r RECEIVE     1
       1   6 procnto-600_exp508  11r RECEIVE     1
       1   7 procnto-600_exp508  10r RECEIVE     1
       1   8 procnto-600_exp508  10r RECEIVE     1
       1   9 procnto-600_exp508  10r RECEIVE     1
       1  10 procnto-600_exp508  10r RECEIVE     1
       1  11 procnto-600_exp508  10r RECEIVE     1
       2   1 proc/boot/slogger   21r RECEIVE     1
       3   1 proc/boot/pipe      10r SIGWAITINFO
       3   2 proc/boot/pipe      10r RECEIVE     1
       3   3 proc/boot/pipe      10r RECEIVE     1
       4   1 proc/boot/devc-pty  10r RECEIVE     1
       5   1 proc/boot/ksh       10r SIGSUSPEND
       6   1 roc/boot/io-pkt-v4  21r SIGWAITINFO
       6   2 roc/boot/io-pkt-v4  21r RECEIVE     1
   20487   1 proc/boot/pidin     10r REPLY       1
# ifconfig
Entered Network Device Stop Function
Exit Network Device Stop Function
ifconfig: getifaddrs: Bad file descriptor
# pidin
     pid tid name               prio STATE       Blocked
       1   1 procnto-600_exp508   0f READY
       1   2 procnto-600_exp508 255r RECEIVE     1
       1   3 procnto-600_exp508 255r RECEIVE     1
       1   4 procnto-600_exp508  10r RUNNING
       1   5 procnto-600_exp508 255r RECEIVE     1
       1   6 procnto-600_exp508  11r RECEIVE     1
       1   7 procnto-600_exp508  10r RECEIVE     1
       1   8 procnto-600_exp508  10r RECEIVE     1
       1   9 procnto-600_exp508  10r RECEIVE     1
       1  10 procnto-600_exp508  10r RECEIVE     1
       1  11 procnto-600_exp508  10r RECEIVE     1
       2   1 proc/boot/slogger   10r RECEIVE     1
       3   1 proc/boot/pipe      10r SIGWAITINFO
       3   2 proc/boot/pipe      10r RECEIVE     1
       3   3 proc/boot/pipe      10r RECEIVE     1
       4   1 proc/boot/devc-pty  10r RECEIVE     1
       5   1 proc/boot/ksh       10r SIGSUSPEND
   40966   1 proc/boot/pidin     10r REPLY       1
Re: Buffer handling within an io-pkt transmit routine  
On Fri, Feb 20, 2015 at 10:39:58AM -0500, William Hoey wrote:
> Apart from the serial port this network driver is the only way into the board.
> 
> What appears to happen is if ether_ifattach is not called io-pkt terminates either setting or getting the interface 
address

It's probably faulting.  Run 'dumper' and transfer the resulting core file
over serial and look at it in the debugger.
Re: Buffer handling within an io-pkt transmit routine  
Downloading the core file possible when using devc-pty?

The debug prints in the driver code a not executed, and apart from the ARP issue works as expected when ether_ifattach 
is called. 
Re: Buffer handling within an io-pkt transmit routine  
Sorry about my last post (cut and paste error). I was trying to determine if it was possible to obtain a dumper log 
using devc-pty. 

I was wondering if there was any example code available of an io-pkt network driver (of a type other than Ethernet or 
WiFi). It appears that I am may not be registering correctly with io-pkt. If I call ether_ifattach and manually add an 
ARP entry for a given IP address I can send and receive packets without issue. However if I do not call ether_ifattach I
 am unable to set or get an IP address. 
Re: Buffer handling within an io-pkt transmit routine  
On Fri, Feb 20, 2015 at 02:23:33PM -0500, William Hoey wrote:
> 
> Sorry about my last post (cut and paste error). I was trying to determine if it was possible to obtain a dumper log 
using devc-pty. 

You may be able to set up a ppp link between your host <-> target
and telnet / ftp over serial.

> 
> I was wondering if there was any example code available of an io-pkt network driver (of a type other than Ethernet or 
WiFi). It appears that I am may not be registering correctly with io-pkt. If I call ether_ifattach and manually add an 
ARP entry for a given IP address I can send and receive packets without issue. However if I do not call ether_ifattach I
 am unable to set or get an IP address. 

If I understand correctly you don't want arp.  You're getting arp
because you're attaching as an ethernet driver.  There's various
examples of non-ethernet interfaces but you'll probbaly have to go
through your sales rep.

Regards,

-seanb