2.2.14 kernel timers,,Kernel Panic

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

 



Hi,
       I'm using a 2.2.14 kernel and I tried using the timer_list structure
 to introduce a delay of 10ms for just one acknowledgement, well
 actually it failed and the kernel went into a "kernel panic" state.
 After goin through some of the mailing list I found that kernel timers
 in 2.2 series kernel are bugs prone...is there any solution to solve
 this problem.

I'm sending the code which I've modified and I'll also
explain the problem that Iam facing.

CODE:
//Added by Me
struct *sock localcopy;

//This Function is ADDED BY ME....
void xt_tcp_send_ack(unsigned long x)
{
tcp_send_ack(sk);
}


//BUILT IN.........SOME PART MODIFIED BY ME..I'VE MARKED
//THOSE PARTS

/*
  * Check if sending an ack is needed.
  */
static __inline__ void __tcp_ack_snd_check(struct sock
*sk)
{
int i=0;
struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);

/* This also takes care of updating the window.
* This if statement needs to be simplified.
*
* Rules for delaying an ack:
*      - delay time <= 0.5 HZ
*      - we don't have a window update to send
*      - must send at least every 2 full sized
packets
* - must send an ACK if we have any out of order
data
*
* With an extra heuristic to handle loss of packet
* situations and also helping the sender leave slow
* start in an expediant manner.
*/

/* Two full frames received or... */
if (((tp->rcv_nxt - tp->rcv_wup) >= tp->rcv_mss *
MAX_DELAY_ACK) ||
    /* We will update the window "significantly"
or... */
    tcp_raise_window(sk) ||
    /* We entered "quick ACK" mode or... */
    tcp_in_quickack_mode(tp) ||
    /* We have out of order data */
    (skb_peek(&tp->out_of_order_queue) != NULL)) {
pkt_count++; //ADDED BY ME TILL ELSE PART

if(pkt_count<=10)
{
tcp_send_ack(sk);
}else if(pkt_count == 10) 
{
/* Then ack it now */
             localcopy=sk;
             struct timer_list ack_delay_timer;
             init_timer(&ack_delay_timer);
             ack_delay_timer.function=xt_tcp_send_ack;
             ack_delay_timer.data=0;
             ack_delay_timer.expires=jiffies + 1;
             add_timer(&ack_delay_timer);
} else if(pkt_count > 10)
{
 tcp_send_ack(sk);
}else {
/* Else, send delayed ack. */
tcp_send_delayed_ack(tp, HZ/2);
       }
}
}

static __inline__ void tcp_ack_snd_check(struct sock
*sk)
{
struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp);
if (tp->delayed_acks == 0) {
/* We sent a data segment already. */
return;
}
__tcp_ack_snd_check(sk);
}

ISSUE:

In function "void xt_tcp_send_ack(unsigned long x)"
i'm calling the tcp_send_ack function which takes a
socket structure element as argument. I've declared a socket structure
as a global variable which is "struct sock *localcopy" and copied the
structure element sk to localcopy. Is this ok or alright.

then for testing purpose I've added a single timer that starts for the
11th packet, gets expired and sends an acknowledgement for the 11 th
packet, for the 12th packet normal TCP transaction takes place. These
modifications have got compiled but the system goes into kernel panic
state.

and can anybody please suggest me how to I implement multiple timers 
So plz suggest me a solution 4 this problem.....

regards
Pradeep.A
-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux