Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Merge in the fixes we had queued in case there was another -rc. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -1893,11 +1893,13 @@ static inline int br_cfm_status_fill_info(struct sk_buff *skb,
|
||||
|
||||
static inline int br_cfm_mep_count(struct net_bridge *br, u32 *count)
|
||||
{
|
||||
*count = 0;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int br_cfm_peer_mep_count(struct net_bridge *br, u32 *count)
|
||||
{
|
||||
*count = 0;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1306,6 +1306,11 @@ ip_proto_again:
|
||||
|
||||
switch (ip_proto) {
|
||||
case IPPROTO_GRE:
|
||||
if (flags & FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP) {
|
||||
fdret = FLOW_DISSECT_RET_OUT_GOOD;
|
||||
break;
|
||||
}
|
||||
|
||||
fdret = __skb_flow_dissect_gre(skb, key_control, flow_dissector,
|
||||
target_container, data,
|
||||
&proto, &nhoff, &hlen, flags);
|
||||
@@ -1363,6 +1368,11 @@ ip_proto_again:
|
||||
break;
|
||||
}
|
||||
case IPPROTO_IPIP:
|
||||
if (flags & FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP) {
|
||||
fdret = FLOW_DISSECT_RET_OUT_GOOD;
|
||||
break;
|
||||
}
|
||||
|
||||
proto = htons(ETH_P_IP);
|
||||
|
||||
key_control->flags |= FLOW_DIS_ENCAPSULATION;
|
||||
@@ -1375,6 +1385,11 @@ ip_proto_again:
|
||||
break;
|
||||
|
||||
case IPPROTO_IPV6:
|
||||
if (flags & FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP) {
|
||||
fdret = FLOW_DISSECT_RET_OUT_GOOD;
|
||||
break;
|
||||
}
|
||||
|
||||
proto = htons(ETH_P_IPV6);
|
||||
|
||||
key_control->flags |= FLOW_DIS_ENCAPSULATION;
|
||||
|
||||
+1
-1
@@ -1435,7 +1435,6 @@ do_udp_sendmsg:
|
||||
if (!fl6.flowi6_oif)
|
||||
fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex;
|
||||
|
||||
fl6.flowi6_mark = ipc6.sockc.mark;
|
||||
fl6.flowi6_uid = sk->sk_uid;
|
||||
|
||||
if (msg->msg_controllen) {
|
||||
@@ -1471,6 +1470,7 @@ do_udp_sendmsg:
|
||||
ipc6.opt = opt;
|
||||
|
||||
fl6.flowi6_proto = sk->sk_protocol;
|
||||
fl6.flowi6_mark = ipc6.sockc.mark;
|
||||
fl6.daddr = *daddr;
|
||||
if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr))
|
||||
fl6.saddr = np->saddr;
|
||||
|
||||
@@ -329,7 +329,8 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
ARRAY_SIZE(fl_ct_info_to_flower_map),
|
||||
post_ct);
|
||||
skb_flow_dissect_hash(skb, &mask->dissector, &skb_key);
|
||||
skb_flow_dissect(skb, &mask->dissector, &skb_key, 0);
|
||||
skb_flow_dissect(skb, &mask->dissector, &skb_key,
|
||||
FLOW_DISSECTOR_F_STOP_BEFORE_ENCAP);
|
||||
|
||||
f = fl_mask_lookup(mask, &skb_key);
|
||||
if (f && !tc_skip_sw(f->flags)) {
|
||||
|
||||
+8
-5
@@ -581,13 +581,16 @@ int sctp_packet_transmit(struct sctp_packet *packet, gfp_t gfp)
|
||||
chunk = list_entry(packet->chunk_list.next, struct sctp_chunk, list);
|
||||
sk = chunk->skb->sk;
|
||||
|
||||
/* check gso */
|
||||
if (packet->size > tp->pathmtu && !packet->ipfragok && !chunk->pmtu_probe) {
|
||||
if (!sk_can_gso(sk)) {
|
||||
pr_err_once("Trying to GSO but underlying device doesn't support it.");
|
||||
goto out;
|
||||
if (tp->pl.state == SCTP_PL_ERROR) { /* do IP fragmentation if in Error state */
|
||||
packet->ipfragok = 1;
|
||||
} else {
|
||||
if (!sk_can_gso(sk)) { /* check gso */
|
||||
pr_err_once("Trying to GSO but underlying device doesn't support it.");
|
||||
goto out;
|
||||
}
|
||||
gso = 1;
|
||||
}
|
||||
gso = 1;
|
||||
}
|
||||
|
||||
/* alloc head skb */
|
||||
|
||||
@@ -269,7 +269,7 @@ bool sctp_transport_pl_send(struct sctp_transport *t)
|
||||
if (t->pl.probe_size == SCTP_BASE_PLPMTU) { /* BASE_PLPMTU Confirmation Failed */
|
||||
t->pl.state = SCTP_PL_ERROR; /* Base -> Error */
|
||||
|
||||
t->pl.pmtu = SCTP_MIN_PLPMTU;
|
||||
t->pl.pmtu = SCTP_BASE_PLPMTU;
|
||||
t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
|
||||
sctp_assoc_sync_pmtu(t->asoc);
|
||||
}
|
||||
@@ -366,8 +366,9 @@ static bool sctp_transport_pl_toobig(struct sctp_transport *t, u32 pmtu)
|
||||
if (pmtu >= SCTP_MIN_PLPMTU && pmtu < SCTP_BASE_PLPMTU) {
|
||||
t->pl.state = SCTP_PL_ERROR; /* Base -> Error */
|
||||
|
||||
t->pl.pmtu = SCTP_MIN_PLPMTU;
|
||||
t->pl.pmtu = SCTP_BASE_PLPMTU;
|
||||
t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
|
||||
return true;
|
||||
}
|
||||
} else if (t->pl.state == SCTP_PL_SEARCH) {
|
||||
if (pmtu >= SCTP_BASE_PLPMTU && pmtu < t->pl.pmtu) {
|
||||
@@ -378,11 +379,10 @@ static bool sctp_transport_pl_toobig(struct sctp_transport *t, u32 pmtu)
|
||||
t->pl.probe_high = 0;
|
||||
t->pl.pmtu = SCTP_BASE_PLPMTU;
|
||||
t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
|
||||
return true;
|
||||
} else if (pmtu > t->pl.pmtu && pmtu < t->pl.probe_size) {
|
||||
t->pl.probe_size = pmtu;
|
||||
t->pl.probe_count = 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
} else if (t->pl.state == SCTP_PL_COMPLETE) {
|
||||
if (pmtu >= SCTP_BASE_PLPMTU && pmtu < t->pl.pmtu) {
|
||||
@@ -393,10 +393,11 @@ static bool sctp_transport_pl_toobig(struct sctp_transport *t, u32 pmtu)
|
||||
t->pl.probe_high = 0;
|
||||
t->pl.pmtu = SCTP_BASE_PLPMTU;
|
||||
t->pathmtu = t->pl.pmtu + sctp_transport_pl_hlen(t);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu)
|
||||
|
||||
Reference in New Issue
Block a user