mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-05 22:25:16 +00:00
[DCCP]: Retrieve packet sequence number for error reporting
This fixes a problem when analysing erroneous packets in dccp_v{4,6}_err: * dccp_hdr_seq currently takes an skb * however, the transport headers in the skb are shifted, due to the preceding IPv4/v6 header. Fixed for v4 and v6 by changing dccp_hdr_seq to take a struct dccp_hdr as argument. Verified that the correct sequence number is now reported in the error handler. Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
03cf786c4e
commit
fde20105f3
3 changed files with 8 additions and 10 deletions
|
@ -270,10 +270,9 @@ static inline struct dccp_hdr *dccp_zeroed_hdr(struct sk_buff *skb, int headlen)
|
||||||
return memset(skb_transport_header(skb), 0, headlen);
|
return memset(skb_transport_header(skb), 0, headlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb)
|
static inline struct dccp_hdr_ext *dccp_hdrx(const struct dccp_hdr *dh)
|
||||||
{
|
{
|
||||||
return (struct dccp_hdr_ext *)(skb_transport_header(skb) +
|
return (struct dccp_hdr_ext *)((unsigned char *)dh + sizeof(*dh));
|
||||||
sizeof(struct dccp_hdr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh)
|
static inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh)
|
||||||
|
@ -287,13 +286,12 @@ static inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb)
|
||||||
return __dccp_basic_hdr_len(dh);
|
return __dccp_basic_hdr_len(dh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __u64 dccp_hdr_seq(const struct sk_buff *skb)
|
static inline __u64 dccp_hdr_seq(const struct dccp_hdr *dh)
|
||||||
{
|
{
|
||||||
const struct dccp_hdr *dh = dccp_hdr(skb);
|
|
||||||
__u64 seq_nr = ntohs(dh->dccph_seq);
|
__u64 seq_nr = ntohs(dh->dccph_seq);
|
||||||
|
|
||||||
if (dh->dccph_x != 0)
|
if (dh->dccph_x != 0)
|
||||||
seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low);
|
seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(dh)->dccph_seq_low);
|
||||||
else
|
else
|
||||||
seq_nr += (u32)dh->dccph_seq2 << 16;
|
seq_nr += (u32)dh->dccph_seq2 << 16;
|
||||||
|
|
||||||
|
|
|
@ -241,7 +241,7 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
dp = dccp_sk(sk);
|
dp = dccp_sk(sk);
|
||||||
seq = dccp_hdr_seq(skb);
|
seq = dccp_hdr_seq(dh);
|
||||||
if (sk->sk_state != DCCP_LISTEN &&
|
if (sk->sk_state != DCCP_LISTEN &&
|
||||||
!between48(seq, dp->dccps_swl, dp->dccps_swh)) {
|
!between48(seq, dp->dccps_swl, dp->dccps_swh)) {
|
||||||
NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
|
NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
|
||||||
|
@ -795,7 +795,7 @@ static int dccp_v4_rcv(struct sk_buff *skb)
|
||||||
|
|
||||||
dh = dccp_hdr(skb);
|
dh = dccp_hdr(skb);
|
||||||
|
|
||||||
DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(skb);
|
DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(dh);
|
||||||
DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
|
DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
|
||||||
|
|
||||||
dccp_pr_debug("%8.8s "
|
dccp_pr_debug("%8.8s "
|
||||||
|
|
|
@ -173,7 +173,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
||||||
|
|
||||||
icmpv6_err_convert(type, code, &err);
|
icmpv6_err_convert(type, code, &err);
|
||||||
|
|
||||||
seq = DCCP_SKB_CB(skb)->dccpd_seq;
|
seq = dccp_hdr_seq(dh);
|
||||||
/* Might be for an request_sock */
|
/* Might be for an request_sock */
|
||||||
switch (sk->sk_state) {
|
switch (sk->sk_state) {
|
||||||
struct request_sock *req, **prev;
|
struct request_sock *req, **prev;
|
||||||
|
@ -787,7 +787,7 @@ static int dccp_v6_rcv(struct sk_buff *skb)
|
||||||
|
|
||||||
dh = dccp_hdr(skb);
|
dh = dccp_hdr(skb);
|
||||||
|
|
||||||
DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(skb);
|
DCCP_SKB_CB(skb)->dccpd_seq = dccp_hdr_seq(dh);
|
||||||
DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
|
DCCP_SKB_CB(skb)->dccpd_type = dh->dccph_type;
|
||||||
|
|
||||||
if (dccp_packet_without_ack(skb))
|
if (dccp_packet_without_ack(skb))
|
||||||
|
|
Loading…
Add table
Reference in a new issue