* Linux IP stack change to obtain TTL min/max/avg
@ 2008-12-31 11:20 mpk_india
2008-12-31 13:34 ` Sam Ravnborg
0 siblings, 1 reply; 4+ messages in thread
From: mpk_india @ 2008-12-31 11:20 UTC (permalink / raw)
To: linux-kernel
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.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Linux IP stack change to obtain TTL min/max/avg
2008-12-31 11:20 Linux IP stack change to obtain TTL min/max/avg mpk_india
@ 2008-12-31 13:34 ` Sam Ravnborg
2009-01-01 14:42 ` mpk_india
0 siblings, 1 reply; 4+ messages in thread
From: Sam Ravnborg @ 2008-12-31 13:34 UTC (permalink / raw)
To: mpk_india, netdev; +Cc: linux-kernel
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/
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Linux IP stack change to obtain TTL min/max/avg
2008-12-31 13:34 ` Sam Ravnborg
@ 2009-01-01 14:42 ` mpk_india
2009-01-01 15:56 ` Sam Ravnborg
0 siblings, 1 reply; 4+ messages in thread
From: mpk_india @ 2009-01-01 14:42 UTC (permalink / raw)
To: linux-kernel
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.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Linux IP stack change to obtain TTL min/max/avg
2009-01-01 14:42 ` mpk_india
@ 2009-01-01 15:56 ` Sam Ravnborg
0 siblings, 0 replies; 4+ messages in thread
From: Sam Ravnborg @ 2009-01-01 15:56 UTC (permalink / raw)
To: mpk_india; +Cc: linux-kernel
Hi mkp.
netdev is the mailing list where the people that is interested
in networking hang out.
Which is why I added them as receiver of your original mail.
When replying on either the linux-kernel or the netdev list
make sure to keep all cc: and to: adresses.
With the amount of traffic that are on these list this is needed.
Sam
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-01-01 15:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-31 11:20 Linux IP stack change to obtain TTL min/max/avg mpk_india
2008-12-31 13:34 ` Sam Ravnborg
2009-01-01 14:42 ` mpk_india
2009-01-01 15:56 ` Sam Ravnborg
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.