Patch "sierra_net: Add support for IPv6 and Dual-Stack Link Sense Indications" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
sierra_net: Add support for IPv6 and Dual-Stack Link Sense Indications
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
sierra_net-add-support-for-ipv6-and-dual-stack-link-sense-indications.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Jun 15 11:13:01 CEST 2017
From: Stefan Br�ns <[email protected]>
Date: Tue, 23 May 2017 21:53:43 -0400
Subject: sierra_net: Add support for IPv6 and Dual-Stack Link Sense Indications
From: Stefan Br�ns <[email protected]>
[ Upstream commit 5a70348e1187c5bf1cbd0ec51843f36befed1c2d ]
If a context is configured as dualstack ("IPv4v6"), the modem indicates the context activation with a slightly different indication message. The dual-stack indication omits the link_type (IPv4/v6) and adds additional address fields.
IPv6 LSIs are identical to IPv4 LSIs, but have a different link type.
--- drivers/net/usb/sierra_net.c | 101 ++++++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 35 deletions(-)
drivers/net/usb/sierra_net.c +66 -35
@@ -73,8 +73,6 @@ static atomic_t iface_counter = ATOMIC_I/* Private data structure */ struct sierra_net_data { -u8 ethr_hdr_tmpl[ETH_HLEN ];/* ethernet header template for rx'd pkts */ -u16 link_up;/* air link up or down */ u8 tx_hdr_template[4 ];/* part of HIP hdr for tx'd packets */
@@ -122,6 +120,7 @@ struct param {/* LSI Protocol types */ #define SIERRA_NET_PROTOCOL_UMTS 0x01 +#define SIERRA_NET_PROTOCOL_UMTS_DS 0x04/* LSI Coverage */ #define SIERRA_NET_COVERAGE_NONE 0x00#define SIERRA_NET_COVERAGE_NOPACKET 0x01
@@ -129,7 +128,8 @@ struct param {/* LSI Session */ #define SIERRA_NET_SESSION_IDLE 0x00/* LSI Link types */ -#define SIERRA_NET_AS_LINK_TYPE_IPv4 0x00 +#define SIERRA_NET_AS_LINK_TYPE_IPV4 0x00 +#define SIERRA_NET_AS_LINK_TYPE_IPV6 0x02struct lsi_umts {u8 protocol;
@@ -137,9 +137,14 @@ struct lsi_umts {__be16 length;/* eventually use a union for the rest - assume umts for now */ u8 coverage; -u8 unused2[41 ]; +u8 network_len;/* network name len */ +u8 network[40 ];/* network name (UCS2, bigendian) */ u8 session_state;u8 unused3[33 ]; +} __packed; + +struct lsi_umts_single { +struct lsi_umts lsi;u8 link_type;u8 pdp_addr_len;/* NW-supplied PDP address len */ u8 pdp_addr[16 ];/* NW-supplied PDP address (bigendian)) */
@@ -158,10 +163,31 @@ struct lsi_umts {u8 reserved[8 ]; } __packed; +struct lsi_umts_dual { +struct lsi_umts lsi; +u8 pdp_addr4_len;/* NW-supplied PDP IPv4 address len */ +u8 pdp_addr4[4 ];/* NW-supplied PDP IPv4 address (bigendian)) */ +u8 pdp_addr6_len;/* NW-supplied PDP IPv6 address len */ +u8 pdp_addr6[16 ];/* NW-supplied PDP IPv6 address (bigendian)) */ +u8 unused4[23 ]; +u8 dns1_addr4_len;/* NW-supplied 1st DNS v4 address len (bigendian) */ +u8 dns1_addr4[4 ];/* NW-supplied 1st DNS v4 address */ +u8 dns1_addr6_len;/* NW-supplied 1st DNS v6 address len */ +u8 dns1_addr6[16 ];/* NW-supplied 1st DNS v6 address (bigendian)*/ +u8 dns2_addr4_len;/* NW-supplied 2nd DNS v4 address len (bigendian) */ +u8 dns2_addr4[4 ];/* NW-supplied 2nd DNS v4 address */ +u8 dns2_addr6_len;/* NW-supplied 2nd DNS v6 address len */ +u8 dns2_addr6[16 ];/* NW-supplied 2nd DNS v6 address (bigendian)*/ +u8 unused5[68 ]; +} __packed; +#define SIERRA_NET_LSI_COMMON_LEN 4 -#define SIERRA_NET_LSI_UMTS_LEN (sizeof(struct lsi_umts)) +#define SIERRA_NET_LSI_UMTS_LEN (sizeof(struct lsi_umts_single))#define SIERRA_NET_LSI_UMTS_STATUS_LEN \ (SIERRA_NET_LSI_UMTS_LEN - SIERRA_NET_LSI_COMMON_LEN) +#define SIERRA_NET_LSI_UMTS_DS_LEN (sizeof(struct lsi_umts_dual)) +#define SIERRA_NET_LSI_UMTS_DS_STATUS_LEN \ + (SIERRA_NET_LSI_UMTS_DS_LEN - SIERRA_NET_LSI_COMMON_LEN)/* Forward definitions */ static void sierra_sync_timer (unsigned long syncdata);
@@ -191,10 +217,11 @@ static inline void sierra_net_set_privat dev->data[0 ] = (unsigned long )priv; } -/* is packet IPv4 */ +/* is packet IPv4/IPv6 */ static inline int is_ip (struct sk_buff *skb) { -return skb->protocol ==cpu_to_be16 (ETH_P_IP ); +return skb->protocol ==cpu_to_be16 (ETH_P_IP ) || + skb->protocol ==cpu_to_be16 (ETH_P_IPV6 ); }/*
@@ -350,18 +377,11 @@ static inline int sierra_net_is_valid_adstatic int sierra_net_parse_lsi (struct usbnet *dev,char *data,int datalen) {struct lsi_umts *lsi = (struct lsi_umts *)data; +u32 expected_length; -if (datalen <sizeof (struct lsi_umts )) { -netdev_err (dev->net,"%s: Data length %d, exp %Zu\n" , - __func__, datalen, -sizeof (struct lsi_umts )); -return -1 ; - } - -if (lsi->length !=cpu_to_be16 (SIERRA_NET_LSI_UMTS_STATUS_LEN )) { -netdev_err (dev->net,"%s: LSI_UMTS_STATUS_LEN %d, exp %u\n" , - __func__,be16_to_cpu (lsi->length), - (u32 )SIERRA_NET_LSI_UMTS_STATUS_LEN ); +if (datalen <sizeof (struct lsi_umts_single )) { +netdev_err (dev->net,"%s: Data length %d, exp >= %Zu\n" , + __func__, datalen,sizeof (struct lsi_umts_single ));return -1 ; }
@@ -373,22 +393,34 @@ static int sierra_net_parse_lsi(struct u }/* Validate the protocol - only support UMTS for now */ -if (lsi->protocol !=SIERRA_NET_PROTOCOL_UMTS ) { +if (lsi->protocol ==SIERRA_NET_PROTOCOL_UMTS ) { +struct lsi_umts_single *single = (struct lsi_umts_single *)lsi; + +/* Validate the link type */ +if (single->link_type !=SIERRA_NET_AS_LINK_TYPE_IPV4 && + single->link_type !=SIERRA_NET_AS_LINK_TYPE_IPV6 ) { +netdev_err (dev->net,"Link type unsupported: 0x%02x\n" , + single->link_type); +return -1 ; + } + expected_length =SIERRA_NET_LSI_UMTS_STATUS_LEN ; + }else if (lsi->protocol ==SIERRA_NET_PROTOCOL_UMTS_DS ) { + expected_length =SIERRA_NET_LSI_UMTS_DS_STATUS_LEN ; + }else {netdev_err (dev->net,"Protocol unsupported, 0x%02x\n" , - lsi->protocol); + lsi->protocol);return -1 ; } -/* Validate the link type */ -if (lsi->link_type != SIERRA_NET_AS_LINK_TYPE_IPv4) { -netdev_err (dev->net,"Link type unsupported: 0x%02x\n" , - lsi->link_type); +if (be16_to_cpu (lsi->length) != expected_length) { +netdev_err (dev->net,"%s: LSI_UMTS_STATUS_LEN %d, exp %u\n" , + __func__,be16_to_cpu (lsi->length), expected_length);return -1 ; }/* Validate the coverage */ -if (lsi->coverage ==SIERRA_NET_COVERAGE_NONE - || lsi->coverage ==SIERRA_NET_COVERAGE_NOPACKET ) { +if (lsi->coverage ==SIERRA_NET_COVERAGE_NONE || + lsi->coverage ==SIERRA_NET_COVERAGE_NOPACKET ) {netdev_err (dev->net,"No coverage, 0x%02x\n" , lsi->coverage);return 0 ; }
@@ -662,7 +694,6 @@ static int sierra_net_bind(struct usbnetu8 numendpoints;u16 fwattr =0 ;int status; -struct ethhdr *eth;struct sierra_net_data *priv;static const u8 sync_tmplate[sizeof (priv->sync_msg)] = {0x00 ,0x00 ,SIERRA_NET_HIP_MSYNC_ID ,0x00 };
@@ -700,11 +731,6 @@ static int sierra_net_bind(struct usbnet dev->net->dev_addr[ETH_ALEN -2 ] =atomic_inc_return (&iface_counter); dev->net->dev_addr[ETH_ALEN -1 ] = ifacenum; -/* we will have to manufacture ethernet headers, prepare template */ - eth = (struct ethhdr *)priv->ethr_hdr_tmpl; -memcpy (ð->h_dest, dev->net->dev_addr,ETH_ALEN ); - eth->h_proto =cpu_to_be16 (ETH_P_IP ); -/* prepare shutdown message template */ memcpy (priv->shdwn_msg, shdwn_tmplate,sizeof (priv->shdwn_msg));/* set context index initially to 0 - prepares tx hdr template */
@@ -833,9 +859,14 @@ static int sierra_net_rx_fixup(struct usskb_pull (skb, hh.hdrlen); -/* We are going to accept this packet, prepare it */ -memcpy (skb->data,sierra_net_get_private (dev)->ethr_hdr_tmpl, -ETH_HLEN ); +/* We are going to accept this packet, prepare it. +* In case protocol is IPv6, keep it, otherwise force IPv4. +*/ +skb_reset_mac_header (skb); +if (eth_hdr (skb)->h_proto !=cpu_to_be16 (ETH_P_IPV6 )) +eth_hdr (skb)->h_proto =cpu_to_be16 (ETH_P_IP ); +eth_zero_addr (eth_hdr (skb)->h_source); +memcpy (eth_hdr (skb)->h_dest, dev->net->dev_addr,ETH_ALEN );/* Last packet in batch handled by usbnet */ if (hh.payload_len.word == skb->len)
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/sierra_net-skip-validating-irrelevant-fields-for-idle-lsis.patch queue-4.4/sierra_net-add-support-for-ipv6-and-dual-stack-link-sense-indications.patch