tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

question about mbuf intialization



In function m_get, all fields in struct m_hdr are initialized except mh_paddr 
(m_paddr) and mh_len (m_len).  m_paddr is initialized in a constructor provided 
to the pool, so that also gets initialized.

In function m_gethdr, all fields in struct pkthdr are initialized expcept segsz 
and len. segsz is there for TCP, so cannot be initialized in m_gethdr.

I am wondering why m_len and m_pkthdr.len are not initialized.

The man page for mbuf does not indicate that the user needs to set these fields 
after calling m_get or m_gethdr.  (The macros calling these functions don't set 
the length fields either.)

As the NetBSD kernel stands now, all protocol use of mbuf's takes care of 
setting the length.  But who is to say there may not be a protocol in the 
future that depends on the lengths being initialized to 0?

The functions m_copydata and m_copyback rely on these fields.  If a protocol 
decides to use these functions to load data rather than using mtod and writing 
directly to the mbuf data bytes, without initialization, these functions will 
have unpredictable behavior.

I am using rump to test some kernel code which heavily relies on mbuf's.  In 
that environment, I am calling mbuf functions to get mbufs and manually filling 
the mbufs using m_copyback.  I can initialize m_len and m_pkthdr.len to 0, but 
this is a pain, and I have to remember to do this for each mbuf I get.

Any reason why we can't add
        m->m_len = 0;
to m_get, and
        m->m_pkthdr.len = 0;
to m_gethdr?

-Bev


Home | Main Index | Thread Index | Old Index