mbuf passed to if_output() in ip_output()
kamal kc
kamal_ckk at yahoo.com
Thu Oct 20 05:13:58 PDT 2005
dear everybody,
i have encountered a problem big enough for me to
handle.
Actually i am trying to compress the data contained
in the ip packets.
i see that the data to be passed by ip to link layer
output routine is contained in mbuf *m.
Now what i tried to do is I tried to copy the original
mbufs to newer mbufs and passed the newer mbufs to the
if_output() instead of the older ones. And I tried to
release the older mbufs myself.
For this purpose i wrote the routine below.
But it doesn't seem to work.
The problem I encounter is the mbuf in the ip_output
doesnot seem to be released and gets printed(by my
custom routine) infinitely.
What is the problem ???
Please help
kamal
PS. i have put the code with which i tried to replace
the original mbufs
void copy_the_memorybuffer(struct mbuf **m)
{ struct mbuf *tmp_mbuf;
struct mbuf *mbuf_pointer=*m; //original mbuf header
struct mbuf **mnext;
struct mbuf **second_mbuf_pointer;
struct mbuf **second_packet_pointer;
struct mbuf **next_packet;
unsigned int ipheaderlength;
unsigned int packet_length;
unsigned char *ip_char_buffer;
int i; //loop variable
second_packet_pointer=&mbuf_pointer->m_nextpkt;
next_packet=&mbuf_pointer->m_nextpkt;
for(;*next_packet;*next_packet=(*next_packet)->m_nextpkt)
{
if(((*next_packet)->m_flags & M_PKTHDR)!=0)
{ struct ip *dest_ip;
dest_ip=mtod((*next_packet),struct ip *);
dest_ip->ip_tos=66;
printf("\nDestination ip
(next_packet)=%s\n",inet_ntoa(dest_ip->ip_dst));
}
second_mbuf_pointer=&(*next_packet)->m_next;
mnext=&(*next_packet)->m_next; //keep the first
packet as it is
for(;*mnext;*mnext=(*mnext)->m_next) //loop until
the end of memory buffer
{
printf("\ninside the for loop(mnext)\n");
if(((*mnext)->m_flags & M_PKTHDR)!=0)
//this is the start of the packet
{ MGETHDR(tmp_mbuf,M_WAIT,(*mnext)->m_type);
if(((*mnext)->m_flags & M_EXT)!=0) //uses a
cluster
MCLGET(tmp_mbuf,M_WAIT);
struct ip *my_ip;
my_ip=mtod(*mnext,struct ip *);
my_ip->ip_tos=55;
printf("\nDestination
ip=%s\n",inet_ntoa(my_ip->ip_dst));
ipheaderlength=my_ip->ip_hl<<2; //4*ip header
length= real header length
packet_length=(*mnext)->m_len;
ip_char_buffer=(unsigned char *)my_ip;
for(i=0;i<ipheaderlength;i++)
{tmp_mbuf->m_data[i]=(*mnext)->m_data[i];
}
for(i=ipheaderlength;i<packet_length;i++)
{tmp_mbuf->m_data[i]=(*mnext)->m_data[i];
}
tmp_mbuf->m_pkthdr.len=(*mnext)->m_pkthdr.len;
tmp_mbuf->m_pkthdr.rcvif=(struct ifnet *)0;
tmp_mbuf->m_pkthdr.header=(*mnext)->m_pkthdr.header;
tmp_mbuf->m_pkthdr.csum_flags=(*mnext)->m_pkthdr.csum_flags;
tmp_mbuf->m_pkthdr.csum_data=(*mnext)->m_pkthdr.csum_data;
}
else //the mbuf is not the packet header so it
does not contain the ip header
{ MGET(tmp_mbuf,M_WAIT,(*mnext)->m_type);
if(((*mnext)->m_flags & M_EXT)!=0)
MCLGET(tmp_mbuf,M_WAIT);
packet_length=(*mnext)->m_len;
for(i=0;i<packet_length;i++) //copy all the
packet data
{ tmp_mbuf->m_data[i]=(*mnext)->m_data[i];
}
}
tmp_mbuf->m_len=(*mnext)->m_len;
tmp_mbuf->m_flags=(*mnext)->m_flags;
tmp_mbuf->m_nextpkt=(*mnext)->m_nextpkt;
tmp_mbuf->m_next=(*mnext)->m_next;
*mnext=tmp_mbuf;
}
m_freem(*second_mbuf_pointer);
}
*m=mbuf_pointer;
return;
}
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
More information about the freebsd-net
mailing list