Date: Tue, 12 Feb 2008 12:05:11 -0600 From: "Biks N" <freebsd.dev@gmail.com> To: "Sam Leffler" <sam@errno.com> Cc: freebsd-hackers@freebsd.org Subject: Re: retrive data from mbuf chain Message-ID: <50cd4e5f0802121005s191a7875s98ffe2ca512389bc@mail.gmail.com> In-Reply-To: <47AB7775.2040000@errno.com> References: <50cd4e5f0802071222w1222d901o3ce8770b5f5725b4@mail.gmail.com> <47AB7775.2040000@errno.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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@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 > >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50cd4e5f0802121005s191a7875s98ffe2ca512389bc>