s390: fix connection hang in qeth
Subsystems (4)
PATCH 1/5 s390: fix connection hang in qeth
From: Ursula Braun <[email protected]>
Frank Pavlic <[email protected]>
Connection hangs when using EDDP mode because sk is NULL when skb has been copied via skb_copy. This results in dropping packets.
Also keep MAC address after recovery of Virtual NICs so that traffic can flow again and duplicate statements in qeth_dev_set_route_store removed.
Signed-off-by Ursula Braun <[email protected]>
Signed-off-by Frank Pavlic <[email protected]>
--- qeth_eddp.c | 4 ++-- qeth_eddp.h | 3 ++- qeth_main.c | 5 +++-- qeth_sys.c | 2 -- 4 files changed, 7 insertions(+), 7 deletions(-)
drivers/s390/net/qeth_eddp.c +2 -2
@@ -620,10 +620,10 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,struct qeth_eddp_context *qeth_eddp_create_context (struct qeth_card *card,struct sk_buff *skb, -struct qeth_hdr *qhdr) +struct qeth_hdr *qhdr,unsigned char sk_protocol) {QETH_DBF_TEXT (trace,5 ,"creddpc" ); -switch (skb->sk->sk_protocol){ +switch (sk_protocol) {case IPPROTO_TCP :return qeth_eddp_create_context_tcp (card, skb, qhdr);default :
drivers/s390/net/qeth_eddp.h +2 -1
@@ -34,7 +34,8 @@ struct qeth_eddp_context_reference { };extern struct qeth_eddp_context * -qeth_eddp_create_context (struct qeth_card *,struct sk_buff *,struct qeth_hdr *); +qeth_eddp_create_context (struct qeth_card *,struct sk_buff *, +struct qeth_hdr *,unsigned char );extern void qeth_eddp_put_context (struct qeth_eddp_context *);
drivers/s390/net/qeth_main.c +3 -2
@@ -4423,7 +4423,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)qeth_fill_header (card, hdr, new_skb, ipv, cast_type); }if (large_send ==QETH_LARGE_SEND_EDDP ) { - ctx =qeth_eddp_create_context (card, new_skb, hdr); + ctx =qeth_eddp_create_context (card, new_skb, hdr, + skb->sk->sk_protocol);if (ctx ==NULL ) {__qeth_free_new_skb (skb, new_skb);PRINT_WARN ("could not create eddp context\n" );
@@ -6584,7 +6585,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,QETH_DBF_TEXT (trace,4 ,"chgmaccb" ); cmd = (struct qeth_ipa_cmd *) data; -if (!card->options.layer2 || card->info.guestlan || +if (!card->options.layer2 || !(card->info.mac_bits &QETH_LAYER2_MAC_READ )) { memcpy(card->dev->dev_addr, &cmd->data.setadapterparms.data.change_addr.addr,
drivers/s390/net/qeth_sys.c +0 -2
@@ -384,8 +384,6 @@ qeth_dev_route_store(struct qeth_card *card, struct qeth_routing_info *route, route->type =PRIMARY_CONNECTOR ; }else if (!strcmp (tmp,"secondary_connector" )) { route->type =SECONDARY_CONNECTOR ; - }else if (!strcmp (tmp,"multicast_router" )) { - route->type =MULTICAST_ROUTER ; }else if (!strcmp (tmp,"primary_router" )) { route->type =PRIMARY_ROUTER ; }else if (!strcmp (tmp,"secondary_router" )) {
Signature · 1 line
1.5.1.2