Messages in this thread | | | Subject | Packet Transmit Amateur progammer!! | From | Felipe Maya <> | Date | Mon, 17 Apr 2006 09:31:59 -0400 |
| |
Hi, I am trying to send one packet in one Congestion Agent. I am Amateur kernel programmer, I want to know what is wrong in this source??
Thanks for Help.
int packet_probe(struct sock *sk){ const struct inet_connection_sock *icsk = inet_csk(sk); struct inet_sock *inet = inet_sk(sk); struct tcp_sock *tp = tcp_sk(sk); struct sk_buff *skb; struct tcphdr *tcph; struct iphdr *iph; size_t tcp_header_size, tlen; unsigned char data[700]; switch(sk->sk_state){ case TCP_LISTEN: case TCP_ESTABLISHED: break; default: goto out; break; } tcp_header_size = MAX_TCP_HEADER + sizeof(data); //skb = alloc_skb(sizeof(*pack), sk->sk_allocation); skb = alloc_skb(MAX_TCP_HEADER, GFP_ATOMIC); if (skb == NULL){ return -1; } // Reserve space for headers and prepare control bits skb_reserve(skb, MAX_TCP_HEADER); skb->csum = 0; TCP_SKB_CB(skb)->flags = TCPCB_FLAG_PSH;//(TCPCB_FLAG_ACK | TCPCB_FLAG_RST); TCP_SKB_CB(skb)->sacked = 0; skb_shinfo(skb)->tso_segs = 1; skb_shinfo(skb)->tso_size = 0;
//Acceptable Sequence if (!before(tp->snd_una+tp->snd_wnd, tp->snd_nxt)){ TCP_SKB_CB(skb)->seq = tp->snd_nxt; } else{ TCP_SKB_CB(skb)->seq = tp->snd_una+tp->snd_wnd; } TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq; TCP_SKB_CB(skb)->when = tcp_time_stamp;
tp->retrans_stamp = TCP_SKB_CB(skb)->when; skb_header_release(skb); __skb_queue_tail(&sk->sk_write_queue, skb); sk_charge_skb(sk, skb); //Number of segments in one skb (No. packs) tp->packets_out += skb_shinfo(skb)->tso_segs; //++++++Send packet////////////////// if (icsk->icsk_ca_ops->rtt_sample){ __net_timestamp(skb); } //Clone skb if is necesary make retranmit //if (unlikely(skb_cloned(skb))) skb = pskb_copy(skb, GFP_ATOMIC); //else skb = skb_clone(skb, GFP_ATOMIC); //if (unlikely(!skb)) return -ENOBUFS; // Build TCP header and checksum it tcph = (struct tcphdr *) skb_push(skb, MAX_TCP_HEADER); skb->h.th = tcph; skb_set_owner_w(skb, sk);
tcph->source = inet->sport; tcph->dest = inet->dport; tcph->seq = htonl(TCP_SKB_CB(skb)->seq); tcph->ack_seq = htonl(tp->rcv_nxt); //*(((__u16 *)tcph) + 6) = htons(((MAX_TCP_HEADER >> 2) << 12) | tcb->flags);
tcph->check = 0; tcph->urg_ptr = 0; tcph->urg = 0; //IP header tlen = sizeof(struct iphdr); iph = (struct iphdr *) __skb_put(skb, tlen); iph->version = 4; iph->ihl = 5; iph->tos = inet->tos; iph->frag_off = 0; //iph->ttl = inet->ttl; iph->daddr = inet->daddr; iph->saddr = inet->saddr; iph->protocol = sk->sk_protocol; iph->tot_len = htons(tlen); skb->nh.iph = iph;
TCP_ECN_send(sk, tp, skb, tcp_header_size); ///////////////////////////////////// TCP_INC_STATS(TCP_MIB_ACTIVEOPENS);
// Timer for repeating the packet probe until an answer //inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, // inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
return 1; out: return 0; }
- 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/
| |