__u16 urg_ptr; /* Valid w/URG flags is set. */
__u32 ack_seq; /* Sequence number ACK'd */
- __u16 tso_factor; /* If > 1, TSO frame */
- __u16 tso_mss; /* MSS that FACTOR's in terms of*/
};
#define TCP_SKB_CB(__skb) ((struct tcp_skb_cb *)&((__skb)->cb[0]))
*/
static inline int tcp_skb_pcount(struct sk_buff *skb)
{
- return TCP_SKB_CB(skb)->tso_factor;
+ return skb_shinfo(skb)->tso_segs;
+}
+
+/* This is valid iff tcp_skb_pcount() > 1. */
+static inline int tcp_skb_psize(struct sk_buff *skb)
+{
+ return skb_shinfo(skb)->tso_size;
}
static inline void tcp_inc_pcount(tcp_pcount_t *count, struct sk_buff *skb)
tcp_minshall_check(tp))));
}
-extern void tcp_set_skb_tso_factor(struct sk_buff *, unsigned int);
+extern void tcp_set_skb_tso_segs(struct sk_buff *, unsigned int);
/* This checks if the data bearing packet SKB (usually sk->sk_send_head)
* should be put on the wire right now.
static __inline__ int tcp_snd_test(struct tcp_opt *tp, struct sk_buff *skb,
unsigned cur_mss, int nonagle)
{
- int pkts = TCP_SKB_CB(skb)->tso_factor;
+ int pkts = tcp_skb_pcount(skb);
if (!pkts) {
- tcp_set_skb_tso_factor(skb, tp->mss_cache_std);
- pkts = TCP_SKB_CB(skb)->tso_factor;
+ tcp_set_skb_tso_segs(skb, tp->mss_cache_std);
+ pkts = tcp_skb_pcount(skb);
}
/* RFC 1122 - section 4.2.3.4
if(!before(TCP_SKB_CB(skb)->seq, end_seq))
break;
- fack_count += TCP_SKB_CB(skb)->tso_factor;
+ fack_count += tcp_skb_pcount(skb);
in_sack = !after(start_seq, TCP_SKB_CB(skb)->seq) &&
!before(end_seq, TCP_SKB_CB(skb)->end_seq);
tcp_set_pcount(&tp->fackets_out, 0);
sk_stream_for_retrans_queue(skb, sk) {
- cnt += TCP_SKB_CB(skb)->tso_factor;;
+ cnt += tcp_skb_pcount(skb);
TCP_SKB_CB(skb)->sacked &= ~TCPCB_LOST;
if (!(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED)) {
tp->undo_marker = tp->snd_una;
sk_stream_for_retrans_queue(skb, sk) {
- cnt += TCP_SKB_CB(skb)->tso_factor;
+ cnt += tcp_skb_pcount(skb);
if (TCP_SKB_CB(skb)->sacked&TCPCB_RETRANS)
tp->undo_marker = 0;
TCP_SKB_CB(skb)->sacked &= (~TCPCB_TAGBITS)|TCPCB_SACKED_ACKED;
BUG_TRAP(cnt <= tcp_get_pcount(&tp->packets_out));
sk_stream_for_retrans_queue(skb, sk) {
- cnt -= TCP_SKB_CB(skb)->tso_factor;
+ cnt -= tcp_skb_pcount(skb);
if (cnt < 0 || after(TCP_SKB_CB(skb)->end_seq, high_seq))
break;
if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) {
{
struct tcp_opt *tp = tcp_sk(sk);
struct tcp_skb_cb *scb = TCP_SKB_CB(skb);
- __u32 mss = scb->tso_mss;
+ __u32 mss = tcp_skb_psize(skb);
__u32 snd_una = tp->snd_una;
__u32 orig_seq, seq;
__u32 packets_acked = 0;
}
tcp_dec_pcount_explicit(&tp->packets_out, packets_acked);
- BUG_ON(scb->tso_factor == 0);
+ BUG_ON(tcp_skb_pcount(skb) == 0);
BUG_ON(!before(scb->seq, scb->end_seq));
}
* the other end.
*/
if (after(scb->end_seq, tp->snd_una)) {
- if (scb->tso_factor > 1)
+ if (tcp_skb_pcount(skb) > 1)
acked |= tcp_tso_acked(sk, skb,
now, &seq_rtt);
break;
int sysctl_flags;
int err;
- BUG_ON(!TCP_SKB_CB(skb)->tso_factor);
+ BUG_ON(!tcp_skb_pcount(skb));
#define SYSCTL_FLAG_TSTAMPS 0x1
#define SYSCTL_FLAG_WSCALE 0x2
}
}
-void tcp_set_skb_tso_factor(struct sk_buff *skb, unsigned int mss_std)
+void tcp_set_skb_tso_segs(struct sk_buff *skb, unsigned int mss_std)
{
if (skb->len <= mss_std) {
/* Avoid the costly divide in the normal
* non-TSO case.
*/
- TCP_SKB_CB(skb)->tso_factor = 1;
+ skb_shinfo(skb)->tso_segs = 1;
+ skb_shinfo(skb)->tso_size = 0;
} else {
unsigned int factor;
factor = skb->len + (mss_std - 1);
factor /= mss_std;
- TCP_SKB_CB(skb)->tso_factor = factor;
+ skb_shinfo(skb)->tso_segs = factor;
+ skb_shinfo(skb)->tso_size = mss_std;
}
- TCP_SKB_CB(skb)->tso_mss = mss_std;
}
/* Function to create two new TCP segments. Shrinks the given segment
}
/* Fix up tso_factor for both original and new SKB. */
- tcp_set_skb_tso_factor(skb, tp->mss_cache_std);
- tcp_set_skb_tso_factor(buff, tp->mss_cache_std);
+ tcp_set_skb_tso_segs(skb, tp->mss_cache_std);
+ tcp_set_skb_tso_segs(buff, tp->mss_cache_std);
if (TCP_SKB_CB(skb)->sacked & TCPCB_LOST) {
tcp_inc_pcount(&tp->lost_out, skb);
/* Any change of skb->len requires recalculation of tso
* factor and mss.
*/
- tcp_set_skb_tso_factor(skb, tp->mss_cache_std);
+ tcp_set_skb_tso_segs(skb, tp->mss_cache_std);
return 0;
}
((skb_size + next_skb_size) > mss_now))
return;
- BUG_ON(TCP_SKB_CB(skb)->tso_factor != 1 ||
- TCP_SKB_CB(next_skb)->tso_factor != 1);
+ BUG_ON(tcp_skb_pcount(skb) != 1 ||
+ tcp_skb_pcount(next_skb) != 1);
/* Ok. We will be able to collapse the packet. */
__skb_unlink(next_skb, next_skb->list);
return -EAGAIN;
if (skb->len > cur_mss) {
- int old_factor = TCP_SKB_CB(skb)->tso_factor;
+ int old_factor = tcp_skb_pcount(skb);
int new_factor;
if (tcp_fragment(sk, skb, cur_mss))
return -ENOMEM; /* We'll try again later. */
/* New SKB created, account for it. */
- new_factor = TCP_SKB_CB(skb)->tso_factor;
+ new_factor = tcp_skb_pcount(skb);
tcp_dec_pcount_explicit(&tp->packets_out,
old_factor - new_factor);
tcp_inc_pcount(&tp->packets_out, skb->next);
tp->snd_una == (TCP_SKB_CB(skb)->end_seq - 1)) {
if (!pskb_trim(skb, 0)) {
TCP_SKB_CB(skb)->seq = TCP_SKB_CB(skb)->end_seq - 1;
- TCP_SKB_CB(skb)->tso_factor = 1;
+ skb_shinfo(skb)->tso_segs = 1;
+ skb_shinfo(skb)->tso_size = 0;
skb->ip_summed = CHECKSUM_NONE;
skb->csum = 0;
}
tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto);
}
- packet_cnt -= TCP_SKB_CB(skb)->tso_factor;
+ packet_cnt -= tcp_skb_pcount(skb);
if (packet_cnt <= 0)
break;
}
skb->csum = 0;
TCP_SKB_CB(skb)->flags = (TCPCB_FLAG_ACK | TCPCB_FLAG_FIN);
TCP_SKB_CB(skb)->sacked = 0;
- TCP_SKB_CB(skb)->tso_factor = 1;
- TCP_SKB_CB(skb)->tso_mss = tp->mss_cache_std;
+ skb_shinfo(skb)->tso_segs = 1;
+ skb_shinfo(skb)->tso_size = 0;
/* FIN eats a sequence byte, write_seq advanced by tcp_queue_skb(). */
TCP_SKB_CB(skb)->seq = tp->write_seq;
skb->csum = 0;
TCP_SKB_CB(skb)->flags = (TCPCB_FLAG_ACK | TCPCB_FLAG_RST);
TCP_SKB_CB(skb)->sacked = 0;
- TCP_SKB_CB(skb)->tso_factor = 1;
- TCP_SKB_CB(skb)->tso_mss = tp->mss_cache_std;
+ skb_shinfo(skb)->tso_segs = 1;
+ skb_shinfo(skb)->tso_size = 0;
/* Send it off. */
TCP_SKB_CB(skb)->seq = tcp_acceptable_seq(sk, tp);
TCP_SKB_CB(skb)->seq = req->snt_isn;
TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + 1;
TCP_SKB_CB(skb)->sacked = 0;
- TCP_SKB_CB(skb)->tso_factor = 1;
- TCP_SKB_CB(skb)->tso_mss = tp->mss_cache_std;
+ skb_shinfo(skb)->tso_segs = 1;
+ skb_shinfo(skb)->tso_size = 0;
th->seq = htonl(TCP_SKB_CB(skb)->seq);
th->ack_seq = htonl(req->rcv_isn + 1);
if (req->rcv_wnd == 0) { /* ignored for retransmitted syns */
TCP_SKB_CB(buff)->flags = TCPCB_FLAG_SYN;
TCP_ECN_send_syn(sk, tp, buff);
TCP_SKB_CB(buff)->sacked = 0;
- TCP_SKB_CB(buff)->tso_factor = 1;
- TCP_SKB_CB(buff)->tso_mss = tp->mss_cache_std;
+ skb_shinfo(buff)->tso_segs = 1;
+ skb_shinfo(buff)->tso_size = 0;
buff->csum = 0;
TCP_SKB_CB(buff)->seq = tp->write_seq++;
TCP_SKB_CB(buff)->end_seq = tp->write_seq;
buff->csum = 0;
TCP_SKB_CB(buff)->flags = TCPCB_FLAG_ACK;
TCP_SKB_CB(buff)->sacked = 0;
- TCP_SKB_CB(buff)->tso_factor = 1;
- TCP_SKB_CB(buff)->tso_mss = tp->mss_cache_std;
+ skb_shinfo(buff)->tso_segs = 1;
+ skb_shinfo(buff)->tso_size = 0;
/* Send it off, this clears delayed acks for us. */
TCP_SKB_CB(buff)->seq = TCP_SKB_CB(buff)->end_seq = tcp_acceptable_seq(sk, tp);
skb->csum = 0;
TCP_SKB_CB(skb)->flags = TCPCB_FLAG_ACK;
TCP_SKB_CB(skb)->sacked = urgent;
- TCP_SKB_CB(skb)->tso_factor = 1;
- TCP_SKB_CB(skb)->tso_mss = tp->mss_cache_std;
+ skb_shinfo(skb)->tso_segs = 1;
+ skb_shinfo(skb)->tso_size = 0;
/* Use a previous sequence. This should cause the other
* end to send an ack. Don't queue or clone SKB, just
sk->sk_route_caps &= ~NETIF_F_TSO;
tp->mss_cache = tp->mss_cache_std;
}
- } else if (!TCP_SKB_CB(skb)->tso_factor)
- tcp_set_skb_tso_factor(skb, tp->mss_cache_std);
+ } else if (!tcp_skb_pcount(skb))
+ tcp_set_skb_tso_segs(skb, tp->mss_cache_std);
TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH;
TCP_SKB_CB(skb)->when = tcp_time_stamp;