mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: mpk_india <mpk_india@yahoo.com>
To: linux-kernel@vger.kernel.org
Subject: Re: Linux IP stack change to obtain TTL min/max/avg
Date: Thu, 1 Jan 2009 06:42:18 -0800 (PST)	[thread overview]
Message-ID: <21241797.post@talk.nabble.com> (raw)
In-Reply-To: <20081231133419.GA2388@uranus.ravnborg.org>


Hello Sam,

Can you elaborate more on how I can fetch these TTL min/max/avg values using
netdev?

Thanks

Mpk 

Sam Ravnborg wrote:
> 
> netdev is a much better place for this - added.
> 
> 	Sam
> 
> On Wed, Dec 31, 2008 at 03:20:53AM -0800, mpk_india wrote:
>> 
>> 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.
>> 
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel"
>> in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
> 

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


  reply	other threads:[~2009-01-01 14:42 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-31 11:20 mpk_india
2008-12-31 13:34 ` Sam Ravnborg
2009-01-01 14:42   ` mpk_india [this message]
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=21241797.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®