All of lore.kernel.org
 help / color / mirror / Atom feed
From: mpk_india <mpk_india@yahoo.com>
To: linux-kernel@vger.kernel.org
Subject: Linux IP stack change to obtain TTL min/max/avg
Date: Wed, 31 Dec 2008 03:20:53 -0800 (PST)	[thread overview]
Message-ID: <21230026.post@talk.nabble.com> (raw)


Hello All,

I am trying to modify the linux ip stack to get the avg/min/max of the TTL
value (in trasport layer) from the received UDP packet. I have modifed the
2.6.28 kernel for this and added new setsockopt flags as IP_RECVTTL_AVG,
IP_RECVTLL_MIN, IP_RECVTTL_MAX.

Please see below changes I have made to do this:

1. Inside "in.h" file Added following macros
#define IP_RECVTTL_AVG	20
#define IP_RECVTTL_MIN	21
#define IP_RECVTTL_MAX	22

2. Inside "inet_sock.h" in struct inet_sock {
added 3 variables
__s16	 uc_ttl_avg;
__s16	 uc_ttl_min;
__s16	 uc_ttl_max;

3. In ipv4/udp.c added following peice of code
sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);
if (sk != NULL) {

#if 1	// Changes to get TTL stats..Start
struct iphdr *iph;
struct inet_sock *inet;
inet = inet_sk(sk);
iph = ip_hdr(skb);
inet->uc_ttl_avg = (iph->ttl + inet->uc_ttl_avg)>>1;
if (inet->uc_ttl_max < iph->ttl)
inet->uc_ttl_max = iph->ttl;
if (inet->uc_ttl_min > iph->ttl)
inet->uc_ttl_min = iph->ttl;
#endif	// Changes to get TTL stats..Start

int ret = udp_queue_rcv_skb(sk, skb);
sock_put(sk);

4. Changes inside "ip_sockglue.c" file

static void ip_cmsg_recv_ttl_avg(struct msghdr *msg, struct sk_buff *skb)
{
struct inet_sock *inet = inet_sk(skb->sk);
int ttl = inet->uc_ttl_avg;
printk(KERN_DEBUG "***<recv ttl avg () is called -- value = %d***\n", ttl);
put_cmsg(msg, SOL_IP, IP_TTL, sizeof(int), &ttl);
}

static void ip_cmsg_recv_ttl_max(struct msghdr *msg, struct sk_buff *skb)
{
struct inet_sock *inet = inet_sk(skb->sk);
int ttl = inet->uc_ttl_max;
printk(KERN_DEBUG "***<recv ttl max () is called -- value = %d***\n", ttl);
put_cmsg(msg, SOL_IP, IP_TTL, sizeof(int), &ttl);
}

static void ip_cmsg_recv_ttl_min(struct msghdr *msg, struct sk_buff *skb)
{
struct inet_sock *inet = inet_sk(skb->sk);
int ttl = inet->uc_ttl_min;
printk(KERN_DEBUG "***<recv ttl min () is called -- value = %d***\n", ttl);
put_cmsg(msg, SOL_IP, IP_TTL, sizeof(int), &ttl);
}

void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb)
{
.
.
.
.
#if 1	// Changes to get TTL stats..Start
if (flags & 1)
ip_cmsg_recv_ttl_avg(msg, skb);
if ((flags>>=1) == 0)
return;
if (flags & 1)
ip_cmsg_recv_ttl_min(msg, skb);
if ((flags>>=1) == 0)
return;
if (flags & 1)
ip_cmsg_recv_ttl_max(msg, skb);
#endif	// Changes to get TTL stats..Start

}

inside do_ip_setsockopt() added following code

#if 1	// Changes to get TTL stats..Start
case IP_RECVTTL_AVG:
if (val)
inet->cmsg_flags |= IP_CMSG_TTL_AVG;
else
inet->cmsg_flags &= ~IP_CMSG_TTL_AVG;
break;
case IP_RECVTTL_MIN:
if (val)
inet->cmsg_flags |= IP_CMSG_TTL_MIN;
else
inet->cmsg_flags &= ~IP_CMSG_TTL_MIN;
break;
case IP_RECVTTL_MAX:
if (val)
inet->cmsg_flags |= IP_CMSG_TTL_MAX;
else
inet->cmsg_flags &= ~IP_CMSG_TTL_MAX;
break;
#endif	// Changes to get TTL stats..End

=================================================================

I have compiled this and written the udp client server to test this. 


In my client application i am sending 64 packets with some dummy message. In
server I have used the recvmsg() and setsockopt() to test these changes as
below:

setsockopt(serverfd, IPPROTO_IP, IP_OPTIONS, NULL, 0);
if (setsockopt (serverfd,IPPROTO_IP, IP_RECVTTL_AVG, &ttl,ttlSize)<0) {

printf ("Error occured in setsockopt\n");
exit(1);
}

now if i do the recvmsg 64 times after recvfrom in my server code it gives
me proper ttl avg values.. but i do not want to seek this values for every
packet i receive.. i want them once for all sent 64 udp packets.. the same
recvmsg fails if i doit single recvmsg after 64 received packets..


Can anyone tell about what i am doing wrong in the present scenario?

Thanks in advance
mpk
-- 
View this message in context: http://www.nabble.com/Linux-IP-stack-change-to-obtain-TTL-min-max-avg-tp21230026p21230026.html
Sent from the linux-kernel mailing list archive at Nabble.com.


             reply	other threads:[~2008-12-31 11:21 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-31 11:20 mpk_india [this message]
2008-12-31 13:34 ` Linux IP stack change to obtain TTL min/max/avg Sam Ravnborg
2009-01-01 14:42   ` mpk_india
2009-01-01 15:56     ` Sam Ravnborg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=21230026.post@talk.nabble.com \
    --to=mpk_india@yahoo.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.