2010-09-24 09:23:53

by Johannes Berg

[permalink] [raw]
Subject: [PATCH 5/5] mac80211: move packet flags into packet

From: Johannes Berg <[email protected]>

commit 8c0c709eea5cbab97fb464cd68b06f24acc58ee1
Author: Johannes Berg <[email protected]>
Date: Wed Nov 25 17:46:15 2009 +0100

mac80211: move cmntr flag out of rx flags

moved the CMNTR flag into the skb RX flags for
some aggregation cleanups, but this was wrong
since the optimisation this flag tried to make
requires that it is kept across the processing
of multiple interfaces -- which isn't true for
flags in the skb. The patch not only broke the
optimisation, it also introduced a bug: under
some (common!) circumstances the flag will be
set on an already freed skb!

However, investigating this in more detail, I
found that most of the flags that we set should
be per packet, _except_ for this one, due to
a-MPDU processing. Additionally, the flags used
for processing (currently just this one) need
to be reset before processing a new packet.

Since we haven't actually seen bugs reported as
a result of the wrong flags handling (which is
not too surprising -- the only real bug case I
can come up with is an a-MSDU contained in an
a-MPDU), I'll make a different fix for rc.

Signed-off-by: Johannes Berg <[email protected]>
---
include/net/mac80211.h | 6 --
net/mac80211/ieee80211_i.h | 38 +++++++++++++---
net/mac80211/rx.c | 102 +++++++++++++++++++++++++--------------------
net/mac80211/wpa.c | 2
4 files changed, 91 insertions(+), 57 deletions(-)

--- wireless-testing.orig/net/mac80211/rx.c 2010-09-24 11:03:11.000000000 +0200
+++ wireless-testing/net/mac80211/rx.c 2010-09-24 11:03:12.000000000 +0200
@@ -315,6 +315,7 @@ ieee80211_rx_monitor(struct ieee80211_lo
static void ieee80211_parse_qos(struct ieee80211_rx_data *rx)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
int tid;

/* does the frame have a qos control field? */
@@ -323,9 +324,7 @@ static void ieee80211_parse_qos(struct i
/* frame has qos control */
tid = *qc & IEEE80211_QOS_CTL_TID_MASK;
if (*qc & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT)
- rx->flags |= IEEE80211_RX_AMSDU;
- else
- rx->flags &= ~IEEE80211_RX_AMSDU;
+ status->rx_flags |= IEEE80211_RX_AMSDU;
} else {
/*
* IEEE 802.11-2007, 7.1.3.4.1 ("Sequence Number field"):
@@ -387,9 +386,10 @@ static ieee80211_rx_result debug_noinlin
ieee80211_rx_h_passive_scan(struct ieee80211_rx_data *rx)
{
struct ieee80211_local *local = rx->local;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
struct sk_buff *skb = rx->skb;

- if (likely(!(rx->flags & IEEE80211_RX_IN_SCAN)))
+ if (likely(!(status->rx_flags & IEEE80211_RX_IN_SCAN)))
return RX_CONTINUE;

if (test_bit(SCAN_HW_SCANNING, &local->scanning))
@@ -783,13 +783,14 @@ static ieee80211_rx_result debug_noinlin
ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

/* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */
if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
rx->sta->last_seq_ctrl[rx->queue] ==
hdr->seq_ctrl)) {
- if (rx->flags & IEEE80211_RX_RA_MATCH) {
+ if (status->rx_flags & IEEE80211_RX_RA_MATCH) {
rx->local->dot11FrameDuplicateCount++;
rx->sta->num_duplicates++;
}
@@ -822,7 +823,7 @@ ieee80211_rx_h_check(struct ieee80211_rx
if ((!ieee80211_has_fromds(hdr->frame_control) &&
!ieee80211_has_tods(hdr->frame_control) &&
ieee80211_is_data(hdr->frame_control)) ||
- !(rx->flags & IEEE80211_RX_RA_MATCH)) {
+ !(status->rx_flags & IEEE80211_RX_RA_MATCH)) {
/* Drop IBSS frames and frames for other hosts
* silently. */
return RX_DROP_MONITOR;
@@ -879,7 +880,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_
* No point in finding a key and decrypting if the frame is neither
* addressed to us nor a multicast frame.
*/
- if (!(rx->flags & IEEE80211_RX_RA_MATCH))
+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
return RX_CONTINUE;

/* start without a key */
@@ -1112,7 +1113,7 @@ ieee80211_rx_h_sta_process(struct ieee80
sta->last_rx = jiffies;
}

- if (!(rx->flags & IEEE80211_RX_RA_MATCH))
+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
return RX_CONTINUE;

if (rx->sdata->vif.type == NL80211_IFTYPE_STATION)
@@ -1269,6 +1270,7 @@ ieee80211_rx_h_defragment(struct ieee802
unsigned int frag, seq;
struct ieee80211_fragment_entry *entry;
struct sk_buff *skb;
+ struct ieee80211_rx_status *status;

hdr = (struct ieee80211_hdr *)rx->skb->data;
fc = hdr->frame_control;
@@ -1368,7 +1370,8 @@ ieee80211_rx_h_defragment(struct ieee802
}

/* Complete frame has been reassembled - process it now */
- rx->flags |= IEEE80211_RX_FRAGMENTED;
+ status = IEEE80211_SKB_RXCB(rx->skb);
+ status->rx_flags |= IEEE80211_RX_FRAGMENTED;

out:
if (rx->sta)
@@ -1385,9 +1388,10 @@ ieee80211_rx_h_ps_poll(struct ieee80211_
{
struct ieee80211_sub_if_data *sdata = rx->sdata;
__le16 fc = ((struct ieee80211_hdr *)rx->skb->data)->frame_control;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

if (likely(!rx->sta || !ieee80211_is_pspoll(fc) ||
- !(rx->flags & IEEE80211_RX_RA_MATCH)))
+ !(status->rx_flags & IEEE80211_RX_RA_MATCH)))
return RX_CONTINUE;

if ((sdata->vif.type != NL80211_IFTYPE_AP) &&
@@ -1548,6 +1552,7 @@ ieee80211_deliver_skb(struct ieee80211_r
struct sk_buff *skb, *xmit_skb;
struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data;
struct sta_info *dsta;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

skb = rx->skb;
xmit_skb = NULL;
@@ -1555,7 +1560,7 @@ ieee80211_deliver_skb(struct ieee80211_r
if ((sdata->vif.type == NL80211_IFTYPE_AP ||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
!(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) &&
- (rx->flags & IEEE80211_RX_RA_MATCH) &&
+ (status->rx_flags & IEEE80211_RX_RA_MATCH) &&
(sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->u.vlan.sta)) {
if (is_multicast_ether_addr(ehdr->h_dest)) {
/*
@@ -1632,6 +1637,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
__le16 fc = hdr->frame_control;
struct sk_buff_head frame_list;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

if (unlikely(!ieee80211_is_data(fc)))
return RX_CONTINUE;
@@ -1639,7 +1645,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx
if (unlikely(!ieee80211_is_data_present(fc)))
return RX_DROP_MONITOR;

- if (!(rx->flags & IEEE80211_RX_AMSDU))
+ if (!(status->rx_flags & IEEE80211_RX_AMSDU))
return RX_CONTINUE;

if (ieee80211_has_a4(hdr->frame_control) &&
@@ -1690,6 +1696,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
struct sk_buff *skb = rx->skb, *fwd_skb;
struct ieee80211_local *local = rx->local;
struct ieee80211_sub_if_data *sdata = rx->sdata;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);

hdr = (struct ieee80211_hdr *) skb->data;
hdrlen = ieee80211_hdrlen(hdr->frame_control);
@@ -1735,7 +1742,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80

mesh_hdr->ttl--;

- if (rx->flags & IEEE80211_RX_RA_MATCH) {
+ if (status->rx_flags & IEEE80211_RX_RA_MATCH) {
if (!mesh_hdr->ttl)
IEEE80211_IFSTA_MESH_CTR_INC(&rx->sdata->u.mesh,
dropped_frames_ttl);
@@ -1945,6 +1952,7 @@ static ieee80211_rx_result debug_noinlin
ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)
{
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

/*
* From here on, look only at management frames.
@@ -1957,7 +1965,7 @@ ieee80211_rx_h_mgmt_check(struct ieee802
if (!ieee80211_is_mgmt(mgmt->frame_control))
return RX_DROP_MONITOR;

- if (!(rx->flags & IEEE80211_RX_RA_MATCH))
+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
return RX_DROP_MONITOR;

if (ieee80211_drop_unencrypted_mgmt(rx))
@@ -1972,6 +1980,7 @@ ieee80211_rx_h_action(struct ieee80211_r
struct ieee80211_local *local = rx->local;
struct ieee80211_sub_if_data *sdata = rx->sdata;
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
int len = rx->skb->len;

if (!ieee80211_is_action(mgmt->frame_control))
@@ -1984,7 +1993,7 @@ ieee80211_rx_h_action(struct ieee80211_r
if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC)
return RX_DROP_UNUSABLE;

- if (!(rx->flags & IEEE80211_RX_RA_MATCH))
+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
return RX_DROP_UNUSABLE;

switch (mgmt->u.action.category) {
@@ -2080,7 +2089,7 @@ ieee80211_rx_h_action(struct ieee80211_r
return RX_CONTINUE;

invalid:
- rx->flags |= IEEE80211_MALFORMED_ACTION_FRM;
+ status->rx_flags |= IEEE80211_RX_MALFORMED_ACTION_FRM;
/* will return in the next handlers */
return RX_CONTINUE;

@@ -2102,10 +2111,10 @@ ieee80211_rx_h_action(struct ieee80211_r
static ieee80211_rx_result debug_noinline
ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
{
- struct ieee80211_rx_status *status;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

/* skip known-bad action frames and return them in the next handler */
- if (rx->flags & IEEE80211_MALFORMED_ACTION_FRM)
+ if (status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM)
return RX_CONTINUE;

/*
@@ -2114,7 +2123,6 @@ ieee80211_rx_h_userspace_mgmt(struct iee
* so userspace can register for those to know whether ones
* it transmitted were processed or returned.
*/
- status = IEEE80211_SKB_RXCB(rx->skb);

if (cfg80211_rx_mgmt(rx->sdata->dev, status->freq,
rx->skb->data, rx->skb->len,
@@ -2136,6 +2144,7 @@ ieee80211_rx_h_action_return(struct ieee
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data;
struct sk_buff *nskb;
struct ieee80211_sub_if_data *sdata = rx->sdata;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);

if (!ieee80211_is_action(mgmt->frame_control))
return RX_CONTINUE;
@@ -2150,7 +2159,7 @@ ieee80211_rx_h_action_return(struct ieee
* registration mechanisms, but older ones still use cooked
* monitor interfaces so push all frames there.
*/
- if (!(rx->flags & IEEE80211_MALFORMED_ACTION_FRM) &&
+ if (!(status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM) &&
(sdata->vif.type == NL80211_IFTYPE_AP ||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN))
return RX_DROP_MONITOR;
@@ -2284,8 +2293,13 @@ static void ieee80211_rx_cooked_monitor(
struct net_device *prev_dev = NULL;
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);

- if (status->flag & RX_FLAG_INTERNAL_CMTR)
+ /*
+ * If cooked monitor has been processed already, then
+ * don't do it again. If not, set the flag.
+ */
+ if (rx->flags & IEEE80211_RX_CMNTR)
goto out_free_skb;
+ rx->flags |= IEEE80211_RX_CMNTR;

if (skb_headroom(skb) < sizeof(*rthdr) &&
pskb_expand_head(skb, sizeof(*rthdr), 0, GFP_ATOMIC))
@@ -2341,12 +2355,8 @@ static void ieee80211_rx_cooked_monitor(
if (prev_dev) {
skb->dev = prev_dev;
netif_receive_skb(skb);
- skb = NULL;
- } else
- goto out_free_skb;
-
- status->flag |= RX_FLAG_INTERNAL_CMTR;
- return;
+ return;
+ }

out_free_skb:
dev_kfree_skb(skb);
@@ -2407,6 +2417,7 @@ static void ieee80211_rx_handlers(struct
* same TID from the same station
*/
rx->skb = skb;
+ rx->flags = 0;

CALL_RXH(ieee80211_rx_h_decrypt)
CALL_RXH(ieee80211_rx_h_check_more_data)
@@ -2477,7 +2488,12 @@ static void ieee80211_invoke_rx_handlers
void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
{
struct sk_buff_head frames;
- struct ieee80211_rx_data rx = { };
+ struct ieee80211_rx_data rx = {
+ .sta = sta,
+ .sdata = sta->sdata,
+ .local = sta->local,
+ .queue = tid,
+ };
struct tid_ampdu_rx *tid_agg_rx;

tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]);
@@ -2486,13 +2502,6 @@ void ieee80211_release_reorder_timeout(s

__skb_queue_head_init(&frames);

- /* construct rx struct */
- rx.sta = sta;
- rx.sdata = sta->sdata;
- rx.local = sta->local;
- rx.queue = tid;
- rx.flags |= IEEE80211_RX_RA_MATCH;
-
spin_lock(&tid_agg_rx->reorder_lock);
ieee80211_sta_reorder_release(&sta->local->hw, tid_agg_rx, &frames);
spin_unlock(&tid_agg_rx->reorder_lock);
@@ -2519,7 +2528,7 @@ static int prepare_for_handlers(struct i
compare_ether_addr(sdata->vif.addr, hdr->addr1) != 0) {
if (!(sdata->dev->flags & IFF_PROMISC))
return 0;
- rx->flags &= ~IEEE80211_RX_RA_MATCH;
+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
}
break;
case NL80211_IFTYPE_ADHOC:
@@ -2529,15 +2538,15 @@ static int prepare_for_handlers(struct i
return 1;
}
else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) {
- if (!(rx->flags & IEEE80211_RX_IN_SCAN))
+ if (!(status->rx_flags & IEEE80211_RX_IN_SCAN))
return 0;
- rx->flags &= ~IEEE80211_RX_RA_MATCH;
+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
} else if (!multicast &&
compare_ether_addr(sdata->vif.addr,
hdr->addr1) != 0) {
if (!(sdata->dev->flags & IFF_PROMISC))
return 0;
- rx->flags &= ~IEEE80211_RX_RA_MATCH;
+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
} else if (!rx->sta) {
int rate_idx;
if (status->flag & RX_FLAG_HT)
@@ -2555,7 +2564,7 @@ static int prepare_for_handlers(struct i
if (!(sdata->dev->flags & IFF_PROMISC))
return 0;

- rx->flags &= ~IEEE80211_RX_RA_MATCH;
+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
}
break;
case NL80211_IFTYPE_AP_VLAN:
@@ -2566,9 +2575,9 @@ static int prepare_for_handlers(struct i
return 0;
} else if (!ieee80211_bssid_match(bssid,
sdata->vif.addr)) {
- if (!(rx->flags & IEEE80211_RX_IN_SCAN))
+ if (!(status->rx_flags & IEEE80211_RX_IN_SCAN))
return 0;
- rx->flags &= ~IEEE80211_RX_RA_MATCH;
+ status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
}
break;
case NL80211_IFTYPE_WDS:
@@ -2602,14 +2611,14 @@ static bool ieee80211_prepare_and_rx_han
int prepares;

rx->skb = skb;
- rx->flags |= IEEE80211_RX_RA_MATCH;
+ status->rx_flags |= IEEE80211_RX_RA_MATCH;
prepares = prepare_for_handlers(rx, hdr);

if (!prepares)
return false;

if (status->flag & RX_FLAG_MMIC_ERROR) {
- if (rx->flags & IEEE80211_RX_RA_MATCH)
+ if (status->rx_flags & IEEE80211_RX_RA_MATCH)
ieee80211_rx_michael_mic_report(hdr, rx);
return false;
}
@@ -2638,6 +2647,7 @@ static bool ieee80211_prepare_and_rx_han
static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
struct sk_buff *skb)
{
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
struct ieee80211_local *local = hw_to_local(hw);
struct ieee80211_sub_if_data *sdata;
struct ieee80211_hdr *hdr;
@@ -2657,7 +2667,7 @@ static void __ieee80211_rx_handle_packet

if (unlikely(test_bit(SCAN_HW_SCANNING, &local->scanning) ||
test_bit(SCAN_OFF_CHANNEL, &local->scanning)))
- rx.flags |= IEEE80211_RX_IN_SCAN;
+ status->rx_flags |= IEEE80211_RX_IN_SCAN;

if (ieee80211_is_mgmt(fc))
err = skb_linearize(skb);
@@ -2808,6 +2818,8 @@ void ieee80211_rx(struct ieee80211_hw *h
}
}

+ status->rx_flags = 0;
+
/*
* key references and virtual interfaces are protected using RCU
* and this requires that we are in a read-side RCU section during
--- wireless-testing.orig/net/mac80211/ieee80211_i.h 2010-09-24 11:02:25.000000000 +0200
+++ wireless-testing/net/mac80211/ieee80211_i.h 2010-09-24 11:03:12.000000000 +0200
@@ -159,13 +159,37 @@ typedef unsigned __bitwise__ ieee80211_r
#define RX_DROP_MONITOR ((__force ieee80211_rx_result) 2u)
#define RX_QUEUED ((__force ieee80211_rx_result) 3u)

-#define IEEE80211_RX_IN_SCAN BIT(0)
-/* frame is destined to interface currently processed (incl. multicast frames) */
-#define IEEE80211_RX_RA_MATCH BIT(1)
-#define IEEE80211_RX_AMSDU BIT(2)
-#define IEEE80211_RX_FRAGMENTED BIT(3)
-#define IEEE80211_MALFORMED_ACTION_FRM BIT(4)
-/* only add flags here that do not change with subframes of an aMPDU */
+/**
+ * enum ieee80211_packet_rx_flags - packet RX flags
+ * @IEEE80211_RX_RA_MATCH: frame is destined to interface currently processed
+ * (incl. multicast frames)
+ * @IEEE80211_RX_IN_SCAN: received while scanning
+ * @IEEE80211_RX_FRAGMENTED: fragmented frame
+ * @IEEE80211_PKT_RX_AMSDU: a-MSDU packet
+ * @IEEE80211_RX_MALFORMED_ACTION_FRM: action frame is malformed
+ *
+ * These are per-frame flags that are attached to a frame in the
+ * @rx_flags field of &struct ieee80211_rx_status.
+ */
+enum ieee80211_packet_rx_flags {
+ IEEE80211_RX_IN_SCAN = BIT(0),
+ IEEE80211_RX_RA_MATCH = BIT(1),
+ IEEE80211_RX_FRAGMENTED = BIT(2),
+ IEEE80211_RX_AMSDU = BIT(3),
+ IEEE80211_RX_MALFORMED_ACTION_FRM = BIT(4),
+};
+
+/**
+ * enum ieee80211_rx_flags - RX data flags
+ *
+ * @IEEE80211_RX_CMNTR: received on cooked monitor already
+ *
+ * These flags are used across handling multiple interfaces
+ * for a single frame.
+ */
+enum ieee80211_rx_flags {
+ IEEE80211_RX_CMNTR = BIT(0),
+};

struct ieee80211_rx_data {
struct sk_buff *skb;
--- wireless-testing.orig/include/net/mac80211.h 2010-09-24 11:02:25.000000000 +0200
+++ wireless-testing/include/net/mac80211.h 2010-09-24 11:03:12.000000000 +0200
@@ -565,9 +565,6 @@ ieee80211_tx_info_clear_status(struct ie
* @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index
* @RX_FLAG_40MHZ: HT40 (40 MHz) was used
* @RX_FLAG_SHORT_GI: Short guard interval was used
- * @RX_FLAG_INTERNAL_CMTR: set internally after frame was reported
- * on cooked monitor to avoid double-reporting it for multiple
- * virtual interfaces
*/
enum mac80211_rx_flags {
RX_FLAG_MMIC_ERROR = 1<<0,
@@ -581,7 +578,6 @@ enum mac80211_rx_flags {
RX_FLAG_HT = 1<<9,
RX_FLAG_40MHZ = 1<<10,
RX_FLAG_SHORT_GI = 1<<11,
- RX_FLAG_INTERNAL_CMTR = 1<<12,
};

/**
@@ -602,6 +598,7 @@ enum mac80211_rx_flags {
* @rate_idx: index of data rate into band's supported rates or MCS index if
* HT rates are use (RX_FLAG_HT)
* @flag: %RX_FLAG_*
+ * @rx_flags: internal RX flags for mac80211
*/
struct ieee80211_rx_status {
u64 mactime;
@@ -611,6 +608,7 @@ struct ieee80211_rx_status {
int antenna;
int rate_idx;
int flag;
+ unsigned int rx_flags;
};

/**
--- wireless-testing.orig/net/mac80211/wpa.c 2010-09-24 11:02:25.000000000 +0200
+++ wireless-testing/net/mac80211/wpa.c 2010-09-24 11:03:12.000000000 +0200
@@ -117,7 +117,7 @@ ieee80211_rx_h_michael_mic_verify(struct
key = &rx->key->conf.key[key_offset];
michael_mic(key, hdr, data, data_len, mic);
if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0 || wpa_test) {
- if (!(rx->flags & IEEE80211_RX_RA_MATCH))
+ if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
return RX_DROP_UNUSABLE;

mac80211_ev_michael_mic_failure(rx->sdata, rx->key->conf.keyidx,




2010-09-24 10:38:27

by Berg, Johannes

[permalink] [raw]
Subject: [PATCH 5/5 v2] mac80211: move packet flags into packet

RnJvbTogSm9oYW5uZXMgQmVyZyA8am9oYW5uZXMuYmVyZ0BpbnRlbC5jb20+Cgpjb21taXQgOGMw
YzcwOWVlYTVjYmFiOTdmYjQ2NGNkNjhiMDZmMjRhY2M1OGVlMQpBdXRob3I6IEpvaGFubmVzIEJl
cmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CkRhdGU6ICAgV2VkIE5vdiAyNSAxNzo0Njox
NSAyMDA5ICswMTAwCgogICAgbWFjODAyMTE6IG1vdmUgY21udHIgZmxhZyBvdXQgb2YgcnggZmxh
Z3MKCm1vdmVkIHRoZSBDTU5UUiBmbGFnIGludG8gdGhlIHNrYiBSWCBmbGFncyBmb3IKc29tZSBh
Z2dyZWdhdGlvbiBjbGVhbnVwcywgYnV0IHRoaXMgd2FzIHdyb25nCnNpbmNlIHRoZSBvcHRpbWlz
YXRpb24gdGhpcyBmbGFnIHRyaWVkIHRvIG1ha2UKcmVxdWlyZXMgdGhhdCBpdCBpcyBrZXB0IGFj
cm9zcyB0aGUgcHJvY2Vzc2luZwpvZiBtdWx0aXBsZSBpbnRlcmZhY2VzIC0tIHdoaWNoIGlzbid0
IHRydWUgZm9yCmZsYWdzIGluIHRoZSBza2IuIFRoZSBwYXRjaCBub3Qgb25seSBicm9rZSB0aGUK
b3B0aW1pc2F0aW9uLCBpdCBhbHNvIGludHJvZHVjZWQgYSBidWc6IHVuZGVyCnNvbWUgKGNvbW1v
biEpIGNpcmN1bXN0YW5jZXMgdGhlIGZsYWcgd2lsbCBiZQpzZXQgb24gYW4gYWxyZWFkeSBmcmVl
ZCBza2IhCgpIb3dldmVyLCBpbnZlc3RpZ2F0aW5nIHRoaXMgaW4gbW9yZSBkZXRhaWwsIEkKZm91
bmQgdGhhdCBtb3N0IG9mIHRoZSBmbGFncyB0aGF0IHdlIHNldCBzaG91bGQKYmUgcGVyIHBhY2tl
dCwgX2V4Y2VwdF8gZm9yIHRoaXMgb25lLCBkdWUgdG8KYS1NUERVIHByb2Nlc3NpbmcuIEFkZGl0
aW9uYWxseSwgdGhlIGZsYWdzIHVzZWQKZm9yIHByb2Nlc3NpbmcgKGN1cnJlbnRseSBqdXN0IHRo
aXMgb25lKSBuZWVkCnRvIGJlIHJlc2V0IGJlZm9yZSBwcm9jZXNzaW5nIGEgbmV3IHBhY2tldC4K
ClNpbmNlIHdlIGhhdmVuJ3QgYWN0dWFsbHkgc2VlbiBidWdzIHJlcG9ydGVkIGFzCmEgcmVzdWx0
IG9mIHRoZSB3cm9uZyBmbGFncyBoYW5kbGluZyAod2hpY2ggaXMKbm90IHRvbyBzdXJwcmlzaW5n
IC0tIHRoZSBvbmx5IHJlYWwgYnVnIGNhc2UgSQpjYW4gY29tZSB1cCB3aXRoIGlzIGFuIGEtTVNE
VSBjb250YWluZWQgaW4gYW4KYS1NUERVKSwgSSdsbCBtYWtlIGEgZGlmZmVyZW50IGZpeCBmb3Ig
cmMuCgpTaWduZWQtb2ZmLWJ5OiBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lcy5iZXJnQGludGVsLmNv
bT4KLS0tCnYyOiBmaXggc21hbGwgYnVnIGluIGRvY3MgZm9yIGEtTVNEVSBmbGFnCgogaW5jbHVk
ZS9uZXQvbWFjODAyMTEuaCAgICAgfCAgICA2IC0tCiBuZXQvbWFjODAyMTEvaWVlZTgwMjExX2ku
aCB8ICAgMzggKysrKysrKysrKysrKy0tLQogbmV0L21hYzgwMjExL3J4LmMgICAgICAgICAgfCAg
MTAyICsrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLQogbmV0L21h
YzgwMjExL3dwYS5jICAgICAgICAgfCAgICAyIAogNCBmaWxlcyBjaGFuZ2VkLCA5MSBpbnNlcnRp
b25zKCspLCA1NyBkZWxldGlvbnMoLSkKCi0tLSB3aXJlbGVzcy10ZXN0aW5nLm9yaWcvbmV0L21h
YzgwMjExL3J4LmMJMjAxMC0wOS0yNCAxMjozNzowNS4wMDAwMDAwMDAgKzAyMDAKKysrIHdpcmVs
ZXNzLXRlc3RpbmcvbmV0L21hYzgwMjExL3J4LmMJMjAxMC0wOS0yNCAxMjozNzoyMC4wMDAwMDAw
MDAgKzAyMDAKQEAgLTMxNSw2ICszMTUsNyBAQCBpZWVlODAyMTFfcnhfbW9uaXRvcihzdHJ1Y3Qg
aWVlZTgwMjExX2xvCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcGFyc2VfcW9zKHN0cnVjdCBpZWVl
ODAyMTFfcnhfZGF0YSAqcngpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1
Y3QgaWVlZTgwMjExX2hkciAqKXJ4LT5za2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9yeF9z
dGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihyeC0+c2tiKTsKIAlpbnQgdGlkOwog
CiAJLyogZG9lcyB0aGUgZnJhbWUgaGF2ZSBhIHFvcyBjb250cm9sIGZpZWxkPyAqLwpAQCAtMzIz
LDkgKzMyNCw3IEBAIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9wYXJzZV9xb3Moc3RydWN0IGkKIAkJ
LyogZnJhbWUgaGFzIHFvcyBjb250cm9sICovCiAJCXRpZCA9ICpxYyAmIElFRUU4MDIxMV9RT1Nf
Q1RMX1RJRF9NQVNLOwogCQlpZiAoKnFjICYgSUVFRTgwMjExX1FPU19DT05UUk9MX0FfTVNEVV9Q
UkVTRU5UKQotCQkJcngtPmZsYWdzIHw9IElFRUU4MDIxMV9SWF9BTVNEVTsKLQkJZWxzZQotCQkJ
cngtPmZsYWdzICY9IH5JRUVFODAyMTFfUlhfQU1TRFU7CisJCQlzdGF0dXMtPnJ4X2ZsYWdzIHw9
IElFRUU4MDIxMV9SWF9BTVNEVTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJRUVFIDgwMi4xMS0y
MDA3LCA3LjEuMy40LjEgKCJTZXF1ZW5jZSBOdW1iZXIgZmllbGQiKToKQEAgLTM4Nyw5ICszODYs
MTAgQEAgc3RhdGljIGllZWU4MDIxMV9yeF9yZXN1bHQgZGVidWdfbm9pbmxpbgogaWVlZTgwMjEx
X3J4X2hfcGFzc2l2ZV9zY2FuKHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSAqcngpCiB7CiAJc3Ry
dWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSByeC0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIx
MV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihyeC0+c2tiKTsKIAlzdHJ1
Y3Qgc2tfYnVmZiAqc2tiID0gcngtPnNrYjsKIAotCWlmIChsaWtlbHkoIShyeC0+ZmxhZ3MgJiBJ
RUVFODAyMTFfUlhfSU5fU0NBTikpKQorCWlmIChsaWtlbHkoIShzdGF0dXMtPnJ4X2ZsYWdzICYg
SUVFRTgwMjExX1JYX0lOX1NDQU4pKSkKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwogCiAJaWYgKHRl
c3RfYml0KFNDQU5fSFdfU0NBTk5JTkcsICZsb2NhbC0+c2Nhbm5pbmcpKQpAQCAtNzgzLDEzICs3
ODMsMTQgQEAgc3RhdGljIGllZWU4MDIxMV9yeF9yZXN1bHQgZGVidWdfbm9pbmxpbgogaWVlZTgw
MjExX3J4X2hfY2hlY2soc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhICpyeCkKIHsKIAlzdHJ1Y3Qg
aWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcngtPnNrYi0+ZGF0
YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9S
WENCKHJ4LT5za2IpOwogCiAJLyogRHJvcCBkdXBsaWNhdGUgODAyLjExIHJldHJhbnNtaXNzaW9u
cyAoSUVFRSA4MDIuMTEgQ2hhcC4gOS4yLjkpICovCiAJaWYgKHJ4LT5zdGEgJiYgIWlzX211bHRp
Y2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7CiAJCWlmICh1bmxpa2VseShpZWVlODAyMTFf
aGFzX3JldHJ5KGhkci0+ZnJhbWVfY29udHJvbCkgJiYKIAkJCSAgICAgcngtPnN0YS0+bGFzdF9z
ZXFfY3RybFtyeC0+cXVldWVdID09CiAJCQkgICAgIGhkci0+c2VxX2N0cmwpKSB7Ci0JCQlpZiAo
cngtPmZsYWdzICYgSUVFRTgwMjExX1JYX1JBX01BVENIKSB7CisJCQlpZiAoc3RhdHVzLT5yeF9m
bGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkgewogCQkJCXJ4LT5sb2NhbC0+ZG90MTFGcmFt
ZUR1cGxpY2F0ZUNvdW50Kys7CiAJCQkJcngtPnN0YS0+bnVtX2R1cGxpY2F0ZXMrKzsKIAkJCX0K
QEAgLTgyMiw3ICs4MjMsNyBAQCBpZWVlODAyMTFfcnhfaF9jaGVjayhzdHJ1Y3QgaWVlZTgwMjEx
X3J4CiAJCWlmICgoIWllZWU4MDIxMV9oYXNfZnJvbWRzKGhkci0+ZnJhbWVfY29udHJvbCkgJiYK
IAkJICAgICAhaWVlZTgwMjExX2hhc190b2RzKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKIAkJICAg
ICBpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB8fAotCQkgICAgIShyeC0+
ZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpKSB7CisJCSAgICAhKHN0YXR1cy0+cnhfZmxh
Z3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpKSB7CiAJCQkvKiBEcm9wIElCU1MgZnJhbWVzIGFu
ZCBmcmFtZXMgZm9yIG90aGVyIGhvc3RzCiAJCQkgKiBzaWxlbnRseS4gKi8KIAkJCXJldHVybiBS
WF9EUk9QX01PTklUT1I7CkBAIC04NzksNyArODgwLDcgQEAgaWVlZTgwMjExX3J4X2hfZGVjcnlw
dChzdHJ1Y3QgaWVlZTgwMjExXwogCSAqIE5vIHBvaW50IGluIGZpbmRpbmcgYSBrZXkgYW5kIGRl
Y3J5cHRpbmcgaWYgdGhlIGZyYW1lIGlzIG5laXRoZXIKIAkgKiBhZGRyZXNzZWQgdG8gdXMgbm9y
IGEgbXVsdGljYXN0IGZyYW1lLgogCSAqLwotCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9S
WF9SQV9NQVRDSCkpCisJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9N
QVRDSCkpCiAJCXJldHVybiBSWF9DT05USU5VRTsKIAogCS8qIHN0YXJ0IHdpdGhvdXQgYSBrZXkg
Ki8KQEAgLTExMTIsNyArMTExMyw3IEBAIGllZWU4MDIxMV9yeF9oX3N0YV9wcm9jZXNzKHN0cnVj
dCBpZWVlODAKIAkJc3RhLT5sYXN0X3J4ID0gamlmZmllczsKIAl9CiAKLQlpZiAoIShyeC0+Zmxh
Z3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpKQorCWlmICghKHN0YXR1cy0+cnhfZmxhZ3MgJiBJ
RUVFODAyMTFfUlhfUkFfTUFUQ0gpKQogCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAKIAlpZiAocngt
PnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQpAQCAtMTI2OSw2ICsx
MjcwLDcgQEAgaWVlZTgwMjExX3J4X2hfZGVmcmFnbWVudChzdHJ1Y3QgaWVlZTgwMgogCXVuc2ln
bmVkIGludCBmcmFnLCBzZXE7CiAJc3RydWN0IGllZWU4MDIxMV9mcmFnbWVudF9lbnRyeSAqZW50
cnk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAq
c3RhdHVzOwogCiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcngtPnNrYi0+ZGF0YTsK
IAlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKQEAgLTEzNjgsNyArMTM3MCw4IEBAIGllZWU4MDIx
MV9yeF9oX2RlZnJhZ21lbnQoc3RydWN0IGllZWU4MDIKIAl9CiAKIAkvKiBDb21wbGV0ZSBmcmFt
ZSBoYXMgYmVlbiByZWFzc2VtYmxlZCAtIHByb2Nlc3MgaXQgbm93ICovCi0JcngtPmZsYWdzIHw9
IElFRUU4MDIxMV9SWF9GUkFHTUVOVEVEOworCXN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihy
eC0+c2tiKTsKKwlzdGF0dXMtPnJ4X2ZsYWdzIHw9IElFRUU4MDIxMV9SWF9GUkFHTUVOVEVEOwog
CiAgb3V0OgogCWlmIChyeC0+c3RhKQpAQCAtMTM4NSw5ICsxMzg4LDEwIEBAIGllZWU4MDIxMV9y
eF9oX3BzX3BvbGwoc3RydWN0IGllZWU4MDIxMV8KIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9p
Zl9kYXRhICpzZGF0YSA9IHJ4LT5zZGF0YTsKIAlfX2xlMTYgZmMgPSAoKHN0cnVjdCBpZWVlODAy
MTFfaGRyICopcngtPnNrYi0+ZGF0YSktPmZyYW1lX2NvbnRyb2w7CisJc3RydWN0IGllZWU4MDIx
MV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihyeC0+c2tiKTsKIAogCWlm
IChsaWtlbHkoIXJ4LT5zdGEgfHwgIWllZWU4MDIxMV9pc19wc3BvbGwoZmMpIHx8Ci0JCSAgICEo
cngtPmZsYWdzICYgSUVFRTgwMjExX1JYX1JBX01BVENIKSkpCisJCSAgICEoc3RhdHVzLT5yeF9m
bGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpKQogCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAK
IAlpZiAoKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkgJiYKQEAgLTE1NDgs
NiArMTU1Miw3IEBAIGllZWU4MDIxMV9kZWxpdmVyX3NrYihzdHJ1Y3QgaWVlZTgwMjExX3IKIAlz
dHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqeG1pdF9za2I7CiAJc3RydWN0IGV0aGhkciAqZWhkciA9IChz
dHJ1Y3QgZXRoaGRyICopIHJ4LT5za2ItPmRhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpkc3RhOwor
CXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMgPSBJRUVFODAyMTFfU0tCX1JYQ0Io
cngtPnNrYik7CiAKIAlza2IgPSByeC0+c2tiOwogCXhtaXRfc2tiID0gTlVMTDsKQEAgLTE1NTUs
NyArMTU2MCw3IEBAIGllZWU4MDIxMV9kZWxpdmVyX3NrYihzdHJ1Y3QgaWVlZTgwMjExX3IKIAlp
ZiAoKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAogCSAgICAgc2RhdGEt
PnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pICYmCiAJICAgICEoc2RhdGEtPmZs
YWdzICYgSUVFRTgwMjExX1NEQVRBX0RPTlRfQlJJREdFX1BBQ0tFVFMpICYmCi0JICAgIChyeC0+
ZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpICYmCisJICAgIChzdGF0dXMtPnJ4X2ZsYWdz
ICYgSUVFRTgwMjExX1JYX1JBX01BVENIKSAmJgogCSAgICAoc2RhdGEtPnZpZi50eXBlICE9IE5M
ODAyMTFfSUZUWVBFX0FQX1ZMQU4gfHwgIXNkYXRhLT51LnZsYW4uc3RhKSkgewogCQlpZiAoaXNf
bXVsdGljYXN0X2V0aGVyX2FkZHIoZWhkci0+aF9kZXN0KSkgewogCQkJLyoKQEAgLTE2MzIsNiAr
MTYzNyw3IEBAIGllZWU4MDIxMV9yeF9oX2Ftc2R1KHN0cnVjdCBpZWVlODAyMTFfcngKIAlzdHJ1
Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRh
OwogCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFk
IGZyYW1lX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4
MDIxMV9TS0JfUlhDQihyeC0+c2tiKTsKIAogCWlmICh1bmxpa2VseSghaWVlZTgwMjExX2lzX2Rh
dGEoZmMpKSkKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwpAQCAtMTYzOSw3ICsxNjQ1LDcgQEAgaWVl
ZTgwMjExX3J4X2hfYW1zZHUoc3RydWN0IGllZWU4MDIxMV9yeAogCWlmICh1bmxpa2VseSghaWVl
ZTgwMjExX2lzX2RhdGFfcHJlc2VudChmYykpKQogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwog
Ci0JaWYgKCEocngtPmZsYWdzICYgSUVFRTgwMjExX1JYX0FNU0RVKSkKKwlpZiAoIShzdGF0dXMt
PnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX0FNU0RVKSkKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwog
CiAJaWYgKGllZWU4MDIxMV9oYXNfYTQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgpAQCAtMTY5MCw2
ICsxNjk2LDcgQEAgaWVlZTgwMjExX3J4X2hfbWVzaF9md2Rpbmcoc3RydWN0IGllZWU4MAogCXN0
cnVjdCBza19idWZmICpza2IgPSByeC0+c2tiLCAqZndkX3NrYjsKIAlzdHJ1Y3QgaWVlZTgwMjEx
X2xvY2FsICpsb2NhbCA9IHJ4LT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRh
ICpzZGF0YSA9IHJ4LT5zZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVz
ID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CiAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9o
ZHIgKikgc2tiLT5kYXRhOwogCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9j
b250cm9sKTsKQEAgLTE3MzUsNyArMTc0Miw3IEBAIGllZWU4MDIxMV9yeF9oX21lc2hfZndkaW5n
KHN0cnVjdCBpZWVlODAKIAogCW1lc2hfaGRyLT50dGwtLTsKIAotCWlmIChyeC0+ZmxhZ3MgJiBJ
RUVFODAyMTFfUlhfUkFfTUFUQ0gpIHsKKwlpZiAoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIx
MV9SWF9SQV9NQVRDSCkgewogCQlpZiAoIW1lc2hfaGRyLT50dGwpCiAJCQlJRUVFODAyMTFfSUZT
VEFfTUVTSF9DVFJfSU5DKCZyeC0+c2RhdGEtPnUubWVzaCwKIAkJCQkJCSAgICAgZHJvcHBlZF9m
cmFtZXNfdHRsKTsKQEAgLTE5NDUsNiArMTk1Miw3IEBAIHN0YXRpYyBpZWVlODAyMTFfcnhfcmVz
dWx0IGRlYnVnX25vaW5saW4KIGllZWU4MDIxMV9yeF9oX21nbXRfY2hlY2soc3RydWN0IGllZWU4
MDIxMV9yeF9kYXRhICpyeCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3Ry
dWN0IGllZWU4MDIxMV9tZ210ICopIHJ4LT5za2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9y
eF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihyeC0+c2tiKTsKIAogCS8qCiAJ
ICogRnJvbSBoZXJlIG9uLCBsb29rIG9ubHkgYXQgbWFuYWdlbWVudCBmcmFtZXMuCkBAIC0xOTU3
LDcgKzE5NjUsNyBAQCBpZWVlODAyMTFfcnhfaF9tZ210X2NoZWNrKHN0cnVjdCBpZWVlODAyCiAJ
aWYgKCFpZWVlODAyMTFfaXNfbWdtdChtZ210LT5mcmFtZV9jb250cm9sKSkKIAkJcmV0dXJuIFJY
X0RST1BfTU9OSVRPUjsKIAotCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRD
SCkpCisJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCiAJ
CXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKIAlpZiAoaWVlZTgwMjExX2Ryb3BfdW5lbmNyeXB0
ZWRfbWdtdChyeCkpCkBAIC0xOTcyLDYgKzE5ODAsNyBAQCBpZWVlODAyMTFfcnhfaF9hY3Rpb24o
c3RydWN0IGllZWU4MDIxMV9yCiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSByeC0+
bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSByeC0+c2RhdGE7
CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAq
KSByeC0+c2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMgPSBJ
RUVFODAyMTFfU0tCX1JYQ0IocngtPnNrYik7CiAJaW50IGxlbiA9IHJ4LT5za2ItPmxlbjsKIAog
CWlmICghaWVlZTgwMjExX2lzX2FjdGlvbihtZ210LT5mcmFtZV9jb250cm9sKSkKQEAgLTE5ODQs
NyArMTk5Myw3IEBAIGllZWU4MDIxMV9yeF9oX2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX3IKIAlp
ZiAoIXJ4LT5zdGEgJiYgbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgIT0gV0xBTl9DQVRFR09SWV9Q
VUJMSUMpCiAJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogCi0JaWYgKCEocngtPmZsYWdzICYg
SUVFRTgwMjExX1JYX1JBX01BVENIKSkKKwlpZiAoIShzdGF0dXMtPnJ4X2ZsYWdzICYgSUVFRTgw
MjExX1JYX1JBX01BVENIKSkKIAkJcmV0dXJuIFJYX0RST1BfVU5VU0FCTEU7CiAKIAlzd2l0Y2gg
KG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5KSB7CkBAIC0yMDgwLDcgKzIwODksNyBAQCBpZWVlODAy
MTFfcnhfaF9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9yCiAJcmV0dXJuIFJYX0NPTlRJTlVFOwog
CiAgaW52YWxpZDoKLQlyeC0+ZmxhZ3MgfD0gSUVFRTgwMjExX01BTEZPUk1FRF9BQ1RJT05fRlJN
OworCXN0YXR1cy0+cnhfZmxhZ3MgfD0gSUVFRTgwMjExX1JYX01BTEZPUk1FRF9BQ1RJT05fRlJN
OwogCS8qIHdpbGwgcmV0dXJuIGluIHRoZSBuZXh0IGhhbmRsZXJzICovCiAJcmV0dXJuIFJYX0NP
TlRJTlVFOwogCkBAIC0yMTAyLDEwICsyMTExLDEwIEBAIGllZWU4MDIxMV9yeF9oX2FjdGlvbihz
dHJ1Y3QgaWVlZTgwMjExX3IKIHN0YXRpYyBpZWVlODAyMTFfcnhfcmVzdWx0IGRlYnVnX25vaW5s
aW5lCiBpZWVlODAyMTFfcnhfaF91c2Vyc3BhY2VfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3J4X2Rh
dGEgKnJ4KQogewotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXM7CisJc3RydWN0
IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihyeC0+c2ti
KTsKIAogCS8qIHNraXAga25vd24tYmFkIGFjdGlvbiBmcmFtZXMgYW5kIHJldHVybiB0aGVtIGlu
IHRoZSBuZXh0IGhhbmRsZXIgKi8KLQlpZiAocngtPmZsYWdzICYgSUVFRTgwMjExX01BTEZPUk1F
RF9BQ1RJT05fRlJNKQorCWlmIChzdGF0dXMtPnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX01BTEZP
Uk1FRF9BQ1RJT05fRlJNKQogCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAKIAkvKgpAQCAtMjExNCw3
ICsyMTIzLDYgQEAgaWVlZTgwMjExX3J4X2hfdXNlcnNwYWNlX21nbXQoc3RydWN0IGllZQogCSAq
IHNvIHVzZXJzcGFjZSBjYW4gcmVnaXN0ZXIgZm9yIHRob3NlIHRvIGtub3cgd2hldGhlciBvbmVz
CiAJICogaXQgdHJhbnNtaXR0ZWQgd2VyZSBwcm9jZXNzZWQgb3IgcmV0dXJuZWQuCiAJICovCi0J
c3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHJ4LT5za2IpOwogCiAJaWYgKGNmZzgwMjExX3J4
X21nbXQocngtPnNkYXRhLT5kZXYsIHN0YXR1cy0+ZnJlcSwKIAkJCSAgICAgcngtPnNrYi0+ZGF0
YSwgcngtPnNrYi0+bGVuLApAQCAtMjEzNiw2ICsyMTQ0LDcgQEAgaWVlZTgwMjExX3J4X2hfYWN0
aW9uX3JldHVybihzdHJ1Y3QgaWVlZQogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChz
dHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgcngtPnNrYi0+ZGF0YTsKIAlzdHJ1Y3Qgc2tfYnVmZiAq
bnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHJ4LT5zZGF0YTsK
KwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENC
KHJ4LT5za2IpOwogCiAJaWYgKCFpZWVlODAyMTFfaXNfYWN0aW9uKG1nbXQtPmZyYW1lX2NvbnRy
b2wpKQogCQlyZXR1cm4gUlhfQ09OVElOVUU7CkBAIC0yMTUwLDcgKzIxNTksNyBAQCBpZWVlODAy
MTFfcnhfaF9hY3Rpb25fcmV0dXJuKHN0cnVjdCBpZWVlCiAJICogcmVnaXN0cmF0aW9uIG1lY2hh
bmlzbXMsIGJ1dCBvbGRlciBvbmVzIHN0aWxsIHVzZSBjb29rZWQKIAkgKiBtb25pdG9yIGludGVy
ZmFjZXMgc28gcHVzaCBhbGwgZnJhbWVzIHRoZXJlLgogCSAqLwotCWlmICghKHJ4LT5mbGFncyAm
IElFRUU4MDIxMV9NQUxGT1JNRURfQUNUSU9OX0ZSTSkgJiYKKwlpZiAoIShzdGF0dXMtPnJ4X2Zs
YWdzICYgSUVFRTgwMjExX1JYX01BTEZPUk1FRF9BQ1RJT05fRlJNKSAmJgogCSAgICAoc2RhdGEt
PnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CiAJICAgICBzZGF0YS0+dmlmLnR5cGUg
PT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikpCiAJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CkBA
IC0yMjg0LDggKzIyOTMsMTMgQEAgc3RhdGljIHZvaWQgaWVlZTgwMjExX3J4X2Nvb2tlZF9tb25p
dG9yKAogCXN0cnVjdCBuZXRfZGV2aWNlICpwcmV2X2RldiA9IE5VTEw7CiAJc3RydWN0IGllZWU4
MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOwogCi0JaWYg
KHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfSU5URVJOQUxfQ01UUikKKwkvKgorCSAqIElmIGNvb2tl
ZCBtb25pdG9yIGhhcyBiZWVuIHByb2Nlc3NlZCBhbHJlYWR5LCB0aGVuCisJICogZG9uJ3QgZG8g
aXQgYWdhaW4uIElmIG5vdCwgc2V0IHRoZSBmbGFnLgorCSAqLworCWlmIChyeC0+ZmxhZ3MgJiBJ
RUVFODAyMTFfUlhfQ01OVFIpCiAJCWdvdG8gb3V0X2ZyZWVfc2tiOworCXJ4LT5mbGFncyB8PSBJ
RUVFODAyMTFfUlhfQ01OVFI7CiAKIAlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBzaXplb2YoKnJ0
aGRyKSAmJgogCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgc2l6ZW9mKCpydGhkciksIDAsIEdG
UF9BVE9NSUMpKQpAQCAtMjM0MSwxMiArMjM1NSw4IEBAIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9y
eF9jb29rZWRfbW9uaXRvcigKIAlpZiAocHJldl9kZXYpIHsKIAkJc2tiLT5kZXYgPSBwcmV2X2Rl
djsKIAkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQkJc2tiID0gTlVMTDsKLQl9IGVsc2UKLQkJ
Z290byBvdXRfZnJlZV9za2I7Ci0KLQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19JTlRFUk5BTF9D
TVRSOwotCXJldHVybjsKKwkJcmV0dXJuOworCX0KIAogIG91dF9mcmVlX3NrYjoKIAlkZXZfa2Zy
ZWVfc2tiKHNrYik7CkBAIC0yNDA3LDYgKzI0MTcsNyBAQCBzdGF0aWMgdm9pZCBpZWVlODAyMTFf
cnhfaGFuZGxlcnMoc3RydWN0CiAJCSAqIHNhbWUgVElEIGZyb20gdGhlIHNhbWUgc3RhdGlvbgog
CQkgKi8KIAkJcngtPnNrYiA9IHNrYjsKKwkJcngtPmZsYWdzID0gMDsKIAogCQlDQUxMX1JYSChp
ZWVlODAyMTFfcnhfaF9kZWNyeXB0KQogCQlDQUxMX1JYSChpZWVlODAyMTFfcnhfaF9jaGVja19t
b3JlX2RhdGEpCkBAIC0yNDc3LDcgKzI0ODgsMTIgQEAgc3RhdGljIHZvaWQgaWVlZTgwMjExX2lu
dm9rZV9yeF9oYW5kbGVycwogdm9pZCBpZWVlODAyMTFfcmVsZWFzZV9yZW9yZGVyX3RpbWVvdXQo
c3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQpCiB7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBm
cmFtZXM7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhIHJ4ID0geyB9OworCXN0cnVjdCBpZWVl
ODAyMTFfcnhfZGF0YSByeCA9IHsKKwkJLnN0YSA9IHN0YSwKKwkJLnNkYXRhID0gc3RhLT5zZGF0
YSwKKwkJLmxvY2FsID0gc3RhLT5sb2NhbCwKKwkJLnF1ZXVlID0gdGlkLAorCX07CiAJc3RydWN0
IHRpZF9hbXBkdV9yeCAqdGlkX2FnZ19yeDsKIAogCXRpZF9hZ2dfcnggPSByY3VfZGVyZWZlcmVu
Y2Uoc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdKTsKQEAgLTI0ODYsMTMgKzI1MDIsNiBAQCB2
b2lkIGllZWU4MDIxMV9yZWxlYXNlX3Jlb3JkZXJfdGltZW91dChzCiAKIAlfX3NrYl9xdWV1ZV9o
ZWFkX2luaXQoJmZyYW1lcyk7CiAKLQkvKiBjb25zdHJ1Y3Qgcnggc3RydWN0ICovCi0Jcnguc3Rh
ID0gc3RhOwotCXJ4LnNkYXRhID0gc3RhLT5zZGF0YTsKLQlyeC5sb2NhbCA9IHN0YS0+bG9jYWw7
Ci0JcngucXVldWUgPSB0aWQ7Ci0JcnguZmxhZ3MgfD0gSUVFRTgwMjExX1JYX1JBX01BVENIOwot
CiAJc3Bpbl9sb2NrKCZ0aWRfYWdnX3J4LT5yZW9yZGVyX2xvY2spOwogCWllZWU4MDIxMV9zdGFf
cmVvcmRlcl9yZWxlYXNlKCZzdGEtPmxvY2FsLT5odywgdGlkX2FnZ19yeCwgJmZyYW1lcyk7CiAJ
c3Bpbl91bmxvY2soJnRpZF9hZ2dfcngtPnJlb3JkZXJfbG9jayk7CkBAIC0yNTE5LDcgKzI1Mjgs
NyBAQCBzdGF0aWMgaW50IHByZXBhcmVfZm9yX2hhbmRsZXJzKHN0cnVjdCBpCiAJCSAgICBjb21w
YXJlX2V0aGVyX2FkZHIoc2RhdGEtPnZpZi5hZGRyLCBoZHItPmFkZHIxKSAhPSAwKSB7CiAJCQlp
ZiAoIShzZGF0YS0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkKIAkJCQlyZXR1cm4gMDsKLQkJ
CXJ4LT5mbGFncyAmPSB+SUVFRTgwMjExX1JYX1JBX01BVENIOworCQkJc3RhdHVzLT5yeF9mbGFn
cyAmPSB+SUVFRTgwMjExX1JYX1JBX01BVENIOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIx
MV9JRlRZUEVfQURIT0M6CkBAIC0yNTI5LDE1ICsyNTM4LDE1IEBAIHN0YXRpYyBpbnQgcHJlcGFy
ZV9mb3JfaGFuZGxlcnMoc3RydWN0IGkKIAkJCXJldHVybiAxOwogCQl9CiAJCWVsc2UgaWYgKCFp
ZWVlODAyMTFfYnNzaWRfbWF0Y2goYnNzaWQsIHNkYXRhLT51Lmlic3MuYnNzaWQpKSB7Ci0JCQlp
ZiAoIShyeC0+ZmxhZ3MgJiBJRUVFODAyMTFfUlhfSU5fU0NBTikpCisJCQlpZiAoIShzdGF0dXMt
PnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX0lOX1NDQU4pKQogCQkJCXJldHVybiAwOwotCQkJcngt
PmZsYWdzICY9IH5JRUVFODAyMTFfUlhfUkFfTUFUQ0g7CisJCQlzdGF0dXMtPnJ4X2ZsYWdzICY9
IH5JRUVFODAyMTFfUlhfUkFfTUFUQ0g7CiAJCX0gZWxzZSBpZiAoIW11bHRpY2FzdCAmJgogCQkJ
ICAgY29tcGFyZV9ldGhlcl9hZGRyKHNkYXRhLT52aWYuYWRkciwKIAkJCQkJICAgICAgaGRyLT5h
ZGRyMSkgIT0gMCkgewogCQkJaWYgKCEoc2RhdGEtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykp
CiAJCQkJcmV0dXJuIDA7Ci0JCQlyeC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9SWF9SQV9NQVRDSDsK
KwkJCXN0YXR1cy0+cnhfZmxhZ3MgJj0gfklFRUU4MDIxMV9SWF9SQV9NQVRDSDsKIAkJfSBlbHNl
IGlmICghcngtPnN0YSkgewogCQkJaW50IHJhdGVfaWR4OwogCQkJaWYgKHN0YXR1cy0+ZmxhZyAm
IFJYX0ZMQUdfSFQpCkBAIC0yNTU1LDcgKzI1NjQsNyBAQCBzdGF0aWMgaW50IHByZXBhcmVfZm9y
X2hhbmRsZXJzKHN0cnVjdCBpCiAJCQlpZiAoIShzZGF0YS0+ZGV2LT5mbGFncyAmIElGRl9QUk9N
SVNDKSkKIAkJCQlyZXR1cm4gMDsKIAotCQkJcngtPmZsYWdzICY9IH5JRUVFODAyMTFfUlhfUkFf
TUFUQ0g7CisJCQlzdGF0dXMtPnJ4X2ZsYWdzICY9IH5JRUVFODAyMTFfUlhfUkFfTUFUQ0g7CiAJ
CX0KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgpAQCAtMjU2Niw5ICsy
NTc1LDkgQEAgc3RhdGljIGludCBwcmVwYXJlX2Zvcl9oYW5kbGVycyhzdHJ1Y3QgaQogCQkJCXJl
dHVybiAwOwogCQl9IGVsc2UgaWYgKCFpZWVlODAyMTFfYnNzaWRfbWF0Y2goYnNzaWQsCiAJCQkJ
CXNkYXRhLT52aWYuYWRkcikpIHsKLQkJCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9J
Tl9TQ0FOKSkKKwkJCWlmICghKHN0YXR1cy0+cnhfZmxhZ3MgJiBJRUVFODAyMTFfUlhfSU5fU0NB
TikpCiAJCQkJcmV0dXJuIDA7Ci0JCQlyeC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9SWF9SQV9NQVRD
SDsKKwkJCXN0YXR1cy0+cnhfZmxhZ3MgJj0gfklFRUU4MDIxMV9SWF9SQV9NQVRDSDsKIAkJfQog
CQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKQEAgLTI2MDIsMTQgKzI2MTEsMTQg
QEAgc3RhdGljIGJvb2wgaWVlZTgwMjExX3ByZXBhcmVfYW5kX3J4X2hhbgogCWludCBwcmVwYXJl
czsKIAogCXJ4LT5za2IgPSBza2I7Ci0JcngtPmZsYWdzIHw9IElFRUU4MDIxMV9SWF9SQV9NQVRD
SDsKKwlzdGF0dXMtPnJ4X2ZsYWdzIHw9IElFRUU4MDIxMV9SWF9SQV9NQVRDSDsKIAlwcmVwYXJl
cyA9IHByZXBhcmVfZm9yX2hhbmRsZXJzKHJ4LCBoZHIpOwogCiAJaWYgKCFwcmVwYXJlcykKIAkJ
cmV0dXJuIGZhbHNlOwogCiAJaWYgKHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfTU1JQ19FUlJPUikg
ewotCQlpZiAocngtPmZsYWdzICYgSUVFRTgwMjExX1JYX1JBX01BVENIKQorCQlpZiAoc3RhdHVz
LT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkKIAkJCWllZWU4MDIxMV9yeF9taWNo
YWVsX21pY19yZXBvcnQoaGRyLCByeCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0yNjM4LDYg
KzI2NDcsNyBAQCBzdGF0aWMgYm9vbCBpZWVlODAyMTFfcHJlcGFyZV9hbmRfcnhfaGFuCiBzdGF0
aWMgdm9pZCBfX2llZWU4MDIxMV9yeF9oYW5kbGVfcGFja2V0KHN0cnVjdCBpZWVlODAyMTFfaHcg
Kmh3LAogCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4
X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CiAJc3RydWN0IGllZWU4
MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CiAJc3RydWN0IGllZWU4MDIxMV9z
dWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKQEAgLTI2NTcs
NyArMjY2Nyw3IEBAIHN0YXRpYyB2b2lkIF9faWVlZTgwMjExX3J4X2hhbmRsZV9wYWNrZXQKIAog
CWlmICh1bmxpa2VseSh0ZXN0X2JpdChTQ0FOX0hXX1NDQU5OSU5HLCAmbG9jYWwtPnNjYW5uaW5n
KSB8fAogCQkgICAgIHRlc3RfYml0KFNDQU5fT0ZGX0NIQU5ORUwsICZsb2NhbC0+c2Nhbm5pbmcp
KSkKLQkJcnguZmxhZ3MgfD0gSUVFRTgwMjExX1JYX0lOX1NDQU47CisJCXN0YXR1cy0+cnhfZmxh
Z3MgfD0gSUVFRTgwMjExX1JYX0lOX1NDQU47CiAKIAlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMp
KQogCQllcnIgPSBza2JfbGluZWFyaXplKHNrYik7CkBAIC0yODA4LDYgKzI4MTgsOCBAQCB2b2lk
IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpoCiAJCX0KIAl9CiAKKwlzdGF0dXMt
PnJ4X2ZsYWdzID0gMDsKKwogCS8qCiAJICoga2V5IHJlZmVyZW5jZXMgYW5kIHZpcnR1YWwgaW50
ZXJmYWNlcyBhcmUgcHJvdGVjdGVkIHVzaW5nIFJDVQogCSAqIGFuZCB0aGlzIHJlcXVpcmVzIHRo
YXQgd2UgYXJlIGluIGEgcmVhZC1zaWRlIFJDVSBzZWN0aW9uIGR1cmluZwotLS0gd2lyZWxlc3Mt
dGVzdGluZy5vcmlnL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCTIwMTAtMDktMjQgMTI6Mzc6
MDUuMDAwMDAwMDAwICswMjAwCisrKyB3aXJlbGVzcy10ZXN0aW5nL25ldC9tYWM4MDIxMS9pZWVl
ODAyMTFfaS5oCTIwMTAtMDktMjQgMTI6Mzc6MjAuMDAwMDAwMDAwICswMjAwCkBAIC0xNTksMTMg
KzE1OSwzNyBAQCB0eXBlZGVmIHVuc2lnbmVkIF9fYml0d2lzZV9fIGllZWU4MDIxMV9yCiAjZGVm
aW5lIFJYX0RST1BfTU9OSVRPUgkJKChfX2ZvcmNlIGllZWU4MDIxMV9yeF9yZXN1bHQpIDJ1KQog
I2RlZmluZSBSWF9RVUVVRUQJCSgoX19mb3JjZSBpZWVlODAyMTFfcnhfcmVzdWx0KSAzdSkKIAot
I2RlZmluZSBJRUVFODAyMTFfUlhfSU5fU0NBTgkJQklUKDApCi0vKiBmcmFtZSBpcyBkZXN0aW5l
ZCB0byBpbnRlcmZhY2UgY3VycmVudGx5IHByb2Nlc3NlZCAoaW5jbC4gbXVsdGljYXN0IGZyYW1l
cykgKi8KLSNkZWZpbmUgSUVFRTgwMjExX1JYX1JBX01BVENICQlCSVQoMSkKLSNkZWZpbmUgSUVF
RTgwMjExX1JYX0FNU0RVCQlCSVQoMikKLSNkZWZpbmUgSUVFRTgwMjExX1JYX0ZSQUdNRU5URUQJ
CUJJVCgzKQotI2RlZmluZSBJRUVFODAyMTFfTUFMRk9STUVEX0FDVElPTl9GUk0JQklUKDQpCi0v
KiBvbmx5IGFkZCBmbGFncyBoZXJlIHRoYXQgZG8gbm90IGNoYW5nZSB3aXRoIHN1YmZyYW1lcyBv
ZiBhbiBhTVBEVSAqLworLyoqCisgKiBlbnVtIGllZWU4MDIxMV9wYWNrZXRfcnhfZmxhZ3MgLSBw
YWNrZXQgUlggZmxhZ3MKKyAqIEBJRUVFODAyMTFfUlhfUkFfTUFUQ0g6IGZyYW1lIGlzIGRlc3Rp
bmVkIHRvIGludGVyZmFjZSBjdXJyZW50bHkgcHJvY2Vzc2VkCisgKgkoaW5jbC4gbXVsdGljYXN0
IGZyYW1lcykKKyAqIEBJRUVFODAyMTFfUlhfSU5fU0NBTjogcmVjZWl2ZWQgd2hpbGUgc2Nhbm5p
bmcKKyAqIEBJRUVFODAyMTFfUlhfRlJBR01FTlRFRDogZnJhZ21lbnRlZCBmcmFtZQorICogQElF
RUU4MDIxMV9SWF9BTVNEVTogYS1NU0RVIHBhY2tldAorICogQElFRUU4MDIxMV9SWF9NQUxGT1JN
RURfQUNUSU9OX0ZSTTogYWN0aW9uIGZyYW1lIGlzIG1hbGZvcm1lZAorICoKKyAqIFRoZXNlIGFy
ZSBwZXItZnJhbWUgZmxhZ3MgdGhhdCBhcmUgYXR0YWNoZWQgdG8gYSBmcmFtZSBpbiB0aGUKKyAq
IEByeF9mbGFncyBmaWVsZCBvZiAmc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMuCisgKi8KK2Vu
dW0gaWVlZTgwMjExX3BhY2tldF9yeF9mbGFncyB7CisJSUVFRTgwMjExX1JYX0lOX1NDQU4JCQk9
IEJJVCgwKSwKKwlJRUVFODAyMTFfUlhfUkFfTUFUQ0gJCQk9IEJJVCgxKSwKKwlJRUVFODAyMTFf
UlhfRlJBR01FTlRFRAkJCT0gQklUKDIpLAorCUlFRUU4MDIxMV9SWF9BTVNEVQkJCT0gQklUKDMp
LAorCUlFRUU4MDIxMV9SWF9NQUxGT1JNRURfQUNUSU9OX0ZSTQk9IEJJVCg0KSwKK307CisKKy8q
KgorICogZW51bSBpZWVlODAyMTFfcnhfZmxhZ3MgLSBSWCBkYXRhIGZsYWdzCisgKgorICogQElF
RUU4MDIxMV9SWF9DTU5UUjogcmVjZWl2ZWQgb24gY29va2VkIG1vbml0b3IgYWxyZWFkeQorICoK
KyAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIGFjcm9zcyBoYW5kbGluZyBtdWx0aXBsZSBpbnRlcmZh
Y2VzCisgKiBmb3IgYSBzaW5nbGUgZnJhbWUuCisgKi8KK2VudW0gaWVlZTgwMjExX3J4X2ZsYWdz
IHsKKwlJRUVFODAyMTFfUlhfQ01OVFIJCT0gQklUKDApLAorfTsKIAogc3RydWN0IGllZWU4MDIx
MV9yeF9kYXRhIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotLS0gd2lyZWxlc3MtdGVzdGluZy5v
cmlnL2luY2x1ZGUvbmV0L21hYzgwMjExLmgJMjAxMC0wOS0yNCAxMjozNzowNS4wMDAwMDAwMDAg
KzAyMDAKKysrIHdpcmVsZXNzLXRlc3RpbmcvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAkyMDEwLTA5
LTI0IDEyOjM3OjIwLjAwMDAwMDAwMCArMDIwMApAQCAtNTY1LDkgKzU2NSw2IEBAIGllZWU4MDIx
MV90eF9pbmZvX2NsZWFyX3N0YXR1cyhzdHJ1Y3QgaWUKICAqIEBSWF9GTEFHX0hUOiBIVCBNQ1Mg
d2FzIHVzZWQgYW5kIHJhdGVfaWR4IGlzIE1DUyBpbmRleAogICogQFJYX0ZMQUdfNDBNSFo6IEhU
NDAgKDQwIE1Ieikgd2FzIHVzZWQKICAqIEBSWF9GTEFHX1NIT1JUX0dJOiBTaG9ydCBndWFyZCBp
bnRlcnZhbCB3YXMgdXNlZAotICogQFJYX0ZMQUdfSU5URVJOQUxfQ01UUjogc2V0IGludGVybmFs
bHkgYWZ0ZXIgZnJhbWUgd2FzIHJlcG9ydGVkCi0gKglvbiBjb29rZWQgbW9uaXRvciB0byBhdm9p
ZCBkb3VibGUtcmVwb3J0aW5nIGl0IGZvciBtdWx0aXBsZQotICoJdmlydHVhbCBpbnRlcmZhY2Vz
CiAgKi8KIGVudW0gbWFjODAyMTFfcnhfZmxhZ3MgewogCVJYX0ZMQUdfTU1JQ19FUlJPUgk9IDE8
PDAsCkBAIC01ODEsNyArNTc4LDYgQEAgZW51bSBtYWM4MDIxMV9yeF9mbGFncyB7CiAJUlhfRkxB
R19IVAkJPSAxPDw5LAogCVJYX0ZMQUdfNDBNSFoJCT0gMTw8MTAsCiAJUlhfRkxBR19TSE9SVF9H
SQk9IDE8PDExLAotCVJYX0ZMQUdfSU5URVJOQUxfQ01UUgk9IDE8PDEyLAogfTsKIAogLyoqCkBA
IC02MDIsNiArNTk4LDcgQEAgZW51bSBtYWM4MDIxMV9yeF9mbGFncyB7CiAgKiBAcmF0ZV9pZHg6
IGluZGV4IG9mIGRhdGEgcmF0ZSBpbnRvIGJhbmQncyBzdXBwb3J0ZWQgcmF0ZXMgb3IgTUNTIGlu
ZGV4IGlmCiAgKglIVCByYXRlcyBhcmUgdXNlIChSWF9GTEFHX0hUKQogICogQGZsYWc6ICVSWF9G
TEFHXyoKKyAqIEByeF9mbGFnczogaW50ZXJuYWwgUlggZmxhZ3MgZm9yIG1hYzgwMjExCiAgKi8K
IHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHsKIAl1NjQgbWFjdGltZTsKQEAgLTYxMSw2ICs2
MDgsNyBAQCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyB7CiAJaW50IGFudGVubmE7CiAJaW50
IHJhdGVfaWR4OwogCWludCBmbGFnOworCXVuc2lnbmVkIGludCByeF9mbGFnczsKIH07CiAKIC8q
KgotLS0gd2lyZWxlc3MtdGVzdGluZy5vcmlnL25ldC9tYWM4MDIxMS93cGEuYwkyMDEwLTA5LTI0
IDEyOjM3OjA1LjAwMDAwMDAwMCArMDIwMAorKysgd2lyZWxlc3MtdGVzdGluZy9uZXQvbWFjODAy
MTEvd3BhLmMJMjAxMC0wOS0yNCAxMjozNzoyMC4wMDAwMDAwMDAgKzAyMDAKQEAgLTExNyw3ICsx
MTcsNyBAQCBpZWVlODAyMTFfcnhfaF9taWNoYWVsX21pY192ZXJpZnkoc3RydWN0CiAJa2V5ID0g
JnJ4LT5rZXktPmNvbmYua2V5W2tleV9vZmZzZXRdOwogCW1pY2hhZWxfbWljKGtleSwgaGRyLCBk
YXRhLCBkYXRhX2xlbiwgbWljKTsKIAlpZiAobWVtY21wKG1pYywgZGF0YSArIGRhdGFfbGVuLCBN
SUNIQUVMX01JQ19MRU4pICE9IDAgfHwgd3BhX3Rlc3QpIHsKLQkJaWYgKCEocngtPmZsYWdzICYg
SUVFRTgwMjExX1JYX1JBX01BVENIKSkKKwkJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4
MDIxMV9SWF9SQV9NQVRDSCkpCiAJCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKIAogCQltYWM4
MDIxMV9ldl9taWNoYWVsX21pY19mYWlsdXJlKHJ4LT5zZGF0YSwgcngtPmtleS0+Y29uZi5rZXlp
ZHgsCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSW50ZWwgR21iSApEb3JuYWNoZXIg
U3RyYXNzZSAxCjg1NjIyIEZlbGRraXJjaGVuL011ZW5jaGVuLCBEZXV0c2NobGFuZCAKU2l0eiBk
ZXIgR2VzZWxsc2NoYWZ0OiBGZWxka2lyY2hlbiBiZWkgTXVlbmNoZW4KR2VzY2hhZWZ0c2Z1ZWhy
ZXI6IERvdWdsYXMgTHVzaywgUGV0ZXIgR2xlaXNzbmVyLCBIYW5uZXMgU2Nod2FkZXJlcgpSZWdp
c3RlcmdlcmljaHQ6IE11ZW5jaGVuIEhSQiA0NzQ1NiAKVXN0Li1JZE5yLi9WQVQgUmVnaXN0cmF0
aW9uIE5vLjogREUxMjkzODU4OTUKQ2l0aWJhbmsgRnJhbmtmdXJ0IGEuTS4gKEJMWiA1MDIgMTA5
IDAwKSA2MDAxMTkwNTIK