retrive data from mbuf chain
Biks N
freebsd.dev at gmail.com
Tue Feb 12 18:05:14 UTC 2008
Hi, thanks to everyone for providing me with different ideas.
First I am trying to use m_copydata() method because I think it will
be easy for me to copy data back and forth (using m_copydataback() ).
But right now I am having problem using m_copydata() function.
I want to copy data in all mbufs (only payload but no tcp/ip header)
except the first Mbuf in chain.
If payload is small enough to fit within 1st mbuf then I don't need that either.
I am getting kernel panic ( please see below).
I can see custom message "Starting m_copydata()" in log file.
So I assume the problem is due to incorrect parameter in m_copydata().
here is the sample of code I am trying to use:
/********************************/
caddr_t my_data_copy = NULL;
/* check if m_len < m_pkthdr.len */
if ( m->m_len < m->m_pkthdr.len ) {
/* copy data if there are more than 1 Mbufs in Chain */
log (LOG_DEBUG,"Starting m_copydata() \n");
m_copydata( m, m->m_len , m->m_pkthdr.len - m->m_len , my_data_copy);
log (LOG_DEBUG,"%d Byte of Data copied\n", m->m_pkthdr.len -
m->m_len);
}
else {
/* skip if there is only 1 MBUF */
//log (LOG_DEBUG,"There must Only 1 MBUF in chain\n");
}
/********************************/
Kernel Panic:
Feb 12 11:36:09 bsd1 /kernel: Fatal trap 12: page fault while in kernel mode
Feb 12 11:36:09 bsd1 /kernel: fault virtual address = 0x0
Feb 12 11:36:09 bsd1 /kernel: fault code = supervisor
write, page not present
Feb 12 11:36:09 bsd1 /kernel: instruction pointer = 0x8:0xc024efc2
Feb 12 11:36:09 bsd1 /kernel: stack pointer = 0x10:0xd15e8d08
Feb 12 11:36:09 bsd1 /kernel: frame pointer = 0x10:0xd15e8d2c
Feb 12 11:36:09 bsd1 /kernel: code segment = base 0x0,
limit 0xfffff, type 0x1b
Feb 12 11:36:09 bsd1 /kernel: = DPL 0, pres 1, def32 1, gran 1
Feb 12 11:36:09 bsd1 /kernel: processor eflags = interrupt enabled,
resume, IOPL = 0
Feb 12 11:36:09 bsd1 /kernel: current process = 154 (ping)
Feb 12 11:36:09 bsd1 /kernel: interrupt mask =
Feb 12 11:36:09 bsd1 /kernel:
I am using "ping -s 1200 host" to send larger packets so that system
creates at least 2 mbufs.
------------
On Feb 7, 2008 3:26 PM, Sam Leffler <sam at errno.com> wrote:
>
> Biks N wrote:
> > Hi,
> >
> > I am new to FreeBSD kernel programming.
> >
> > Currently I am trying to work on mbuf data manupulation.
> >
> > >From my understanding: data (payload) is stored into one or more mufs
> > which are chained together through m_next pointer.
> >
> > Now, I need to retrive all data in mbuf chain ( mbufs linked by
> > m_next). I am working ip_output() in netinet/ip_output.c
> >
> > Does there exist inbuilt function/macro to retrive all the data in mbuf chain?
> >
>
> man 9 mbuf; look for m_copydata.
>
> Sam
>
>
More information about the freebsd-hackers
mailing list