About ether_output() function in if_etheresubr.c
Daniel Hellstrom
daniel at gaisler.com
Tue Mar 17 14:06:18 UTC 2015
Hello Albert,
Please provide more information about the order and content of the packets being transferred.
My guess is that the following would happen:
1. PC sends to broadcast: ARP request for RTEMS IP
2. RTEMS responds PC: ARP reply
3. PC sends to RTEMS: PING request
4. RTEMS sends to broadcast: ARP request for PING reply IP
5. PC responds RTEMS: ARP reply
6. RTEMS sends to PC: PING reply
Thus three Ethernet frames from the RTEMS machine.
You can use wireshark to sniff the traffic and present it in detail. I think you need wireshark or similar if you are going to develop a network driver for RTEMS.
Regards,
Daniel H
On 03/17/2015 07:13 AM, Albert Chun-Chieh Huang wrote:
> Hi, all,
>
> I'm currently working on adding a network device driver to rtems. The source tree was grabbed on July, 2014. It's still not working properly right now. But I have some questions about the network
> stack code.
>
> I added printf function in if_etheresubr.c in the directory cpukit/libnetworking/net/ as the following:
> int
> ether_output(struct ifnet *ifp, struct mbuf *m,
> struct sockaddr *dst, struct rtentry *rt0)
> {
> short type;
> int s, error = 0;
> u_char edst[6];
> register struct rtentry *rt;
> struct mbuf *mcopy = (struct mbuf *)0;
> register struct ether_header *eh;
> int len = m->m_pkthdr.len;
> struct arpcom *ac = (struct arpcom *)ifp;
> #ifdef NETATALK
> struct at_ifaddr *aa;
> #endif /* NETATALK */
>
> if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING))
> senderr(ENETDOWN);
> printk("ether_output: length = %d, if_flags = 0x%08x\n", len, ifp->if_flags);
> ========================================
>
> And I got the following messages when I ping the RTEMS system on ARM:
> =======================================================
> ip_output 0, length = 84, MTU = 1500
> ether_output: length = 84, if_flags = 0x00000847
> ether_output: length = 28, if_flags = 0x00000847
> if_ethersubr.c: m_len = 28, leading space = 68
> if_ethersubr.c: MSIZE = 128, MLEN = 104
> if_ethersubr.c: m_len = 42
> =======================================================
>
> During this period of time, there are only two kinds of packets, one is PING(echo reply), the other is ARP; the one with 84 bytes is PING, and the one with 28 is ARP, both will be added 14 bytes of
> Ethernet header later, and makes them 98 bytes and 42 bytes.
>
> Here, ether_output() was called twice when a PING is sent from IP layer. Is it normal? I didn't get PING reply from this board. And I just want to make sure if ether_output being called twice normal
> or not, so that I can decide which way to go.
>
> Thanks in advance.
>
>
> Albert
>
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list