|
@@ -426,13 +426,16 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
|
|
struct dst_entry *dst = NULL;
|
|
struct dst_entry *dst = NULL;
|
|
union sctp_addr *daddr = &t->ipaddr;
|
|
union sctp_addr *daddr = &t->ipaddr;
|
|
union sctp_addr dst_saddr;
|
|
union sctp_addr dst_saddr;
|
|
|
|
+ __u8 tos = inet_sk(sk)->tos;
|
|
|
|
|
|
|
|
+ if (t->dscp & SCTP_DSCP_SET_MASK)
|
|
|
|
+ tos = t->dscp & SCTP_DSCP_VAL_MASK;
|
|
memset(fl4, 0x0, sizeof(struct flowi4));
|
|
memset(fl4, 0x0, sizeof(struct flowi4));
|
|
fl4->daddr = daddr->v4.sin_addr.s_addr;
|
|
fl4->daddr = daddr->v4.sin_addr.s_addr;
|
|
fl4->fl4_dport = daddr->v4.sin_port;
|
|
fl4->fl4_dport = daddr->v4.sin_port;
|
|
fl4->flowi4_proto = IPPROTO_SCTP;
|
|
fl4->flowi4_proto = IPPROTO_SCTP;
|
|
if (asoc) {
|
|
if (asoc) {
|
|
- fl4->flowi4_tos = RT_CONN_FLAGS(asoc->base.sk);
|
|
|
|
|
|
+ fl4->flowi4_tos = RT_CONN_FLAGS_TOS(asoc->base.sk, tos);
|
|
fl4->flowi4_oif = asoc->base.sk->sk_bound_dev_if;
|
|
fl4->flowi4_oif = asoc->base.sk->sk_bound_dev_if;
|
|
fl4->fl4_sport = htons(asoc->base.bind_addr.port);
|
|
fl4->fl4_sport = htons(asoc->base.bind_addr.port);
|
|
}
|
|
}
|
|
@@ -495,7 +498,7 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
|
|
fl4->fl4_sport = laddr->a.v4.sin_port;
|
|
fl4->fl4_sport = laddr->a.v4.sin_port;
|
|
flowi4_update_output(fl4,
|
|
flowi4_update_output(fl4,
|
|
asoc->base.sk->sk_bound_dev_if,
|
|
asoc->base.sk->sk_bound_dev_if,
|
|
- RT_CONN_FLAGS(asoc->base.sk),
|
|
|
|
|
|
+ RT_CONN_FLAGS_TOS(asoc->base.sk, tos),
|
|
daddr->v4.sin_addr.s_addr,
|
|
daddr->v4.sin_addr.s_addr,
|
|
laddr->a.v4.sin_addr.s_addr);
|
|
laddr->a.v4.sin_addr.s_addr);
|
|
|
|
|
|
@@ -971,16 +974,21 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
|
|
struct sctp_transport *transport)
|
|
struct sctp_transport *transport)
|
|
{
|
|
{
|
|
struct inet_sock *inet = inet_sk(skb->sk);
|
|
struct inet_sock *inet = inet_sk(skb->sk);
|
|
|
|
+ __u8 dscp = inet->tos;
|
|
|
|
|
|
pr_debug("%s: skb:%p, len:%d, src:%pI4, dst:%pI4\n", __func__, skb,
|
|
pr_debug("%s: skb:%p, len:%d, src:%pI4, dst:%pI4\n", __func__, skb,
|
|
- skb->len, &transport->fl.u.ip4.saddr, &transport->fl.u.ip4.daddr);
|
|
|
|
|
|
+ skb->len, &transport->fl.u.ip4.saddr,
|
|
|
|
+ &transport->fl.u.ip4.daddr);
|
|
|
|
+
|
|
|
|
+ if (transport->dscp & SCTP_DSCP_SET_MASK)
|
|
|
|
+ dscp = transport->dscp & SCTP_DSCP_VAL_MASK;
|
|
|
|
|
|
inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ?
|
|
inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ?
|
|
IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
|
|
IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
|
|
|
|
|
|
SCTP_INC_STATS(sock_net(&inet->sk), SCTP_MIB_OUTSCTPPACKS);
|
|
SCTP_INC_STATS(sock_net(&inet->sk), SCTP_MIB_OUTSCTPPACKS);
|
|
|
|
|
|
- return ip_queue_xmit(&inet->sk, skb, &transport->fl);
|
|
|
|
|
|
+ return __ip_queue_xmit(&inet->sk, skb, &transport->fl, dscp);
|
|
}
|
|
}
|
|
|
|
|
|
static struct sctp_af sctp_af_inet;
|
|
static struct sctp_af sctp_af_inet;
|