aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJouni Malinen <jkmaline@cc.hut.fi>2005-07-30 15:50:02 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-07-30 18:17:23 -0400
commit2e4fd068e7e25e654a454ed4a425f239c0f6407a (patch)
tree64206e16c44242428b9eeb48b21109d478de6782 /drivers
parent72ca9c61cddb82a8596cee8141656d50aba42be5 (diff)
[PATCH] hostap update
Cleaned up scan result processing by converting struct hfa384x_scan_result into struct hfa384x_hostscan_result. This removes special cases from result processing since the results are only used in one, hostscan, format. Signed-off-by: Jouni Malinen <jkmaline@cc.hut.fi> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/hostap/hostap_info.c24
-rw-r--r--drivers/net/wireless/hostap/hostap_ioctl.c77
-rw-r--r--drivers/net/wireless/hostap/hostap_proc.c52
-rw-r--r--drivers/net/wireless/hostap/hostap_wlan.h4
4 files changed, 65 insertions, 92 deletions
diff --git a/drivers/net/wireless/hostap/hostap_info.c b/drivers/net/wireless/hostap/hostap_info.c
index cf9e0898b57f..6ca94918e0f8 100644
--- a/drivers/net/wireless/hostap/hostap_info.c
+++ b/drivers/net/wireless/hostap/hostap_info.c
@@ -160,7 +160,7 @@ static void prism2_host_roaming(local_info_t *local)
160{ 160{
161 struct hfa384x_join_request req; 161 struct hfa384x_join_request req;
162 struct net_device *dev = local->dev; 162 struct net_device *dev = local->dev;
163 struct hfa384x_scan_result *selected, *entry; 163 struct hfa384x_hostscan_result *selected, *entry;
164 int i; 164 int i;
165 unsigned long flags; 165 unsigned long flags;
166 166
@@ -244,9 +244,10 @@ static void prism2_info_scanresults(local_info_t *local, unsigned char *buf,
244 int left) 244 int left)
245{ 245{
246 u16 *pos; 246 u16 *pos;
247 int new_count; 247 int new_count, i;
248 unsigned long flags; 248 unsigned long flags;
249 struct hfa384x_scan_result *results, *prev; 249 struct hfa384x_scan_result *res;
250 struct hfa384x_hostscan_result *results, *prev;
250 251
251 if (left < 4) { 252 if (left < 4) {
252 printk(KERN_DEBUG "%s: invalid scanresult info frame " 253 printk(KERN_DEBUG "%s: invalid scanresult info frame "
@@ -260,11 +261,18 @@ static void prism2_info_scanresults(local_info_t *local, unsigned char *buf,
260 left -= 4; 261 left -= 4;
261 262
262 new_count = left / sizeof(struct hfa384x_scan_result); 263 new_count = left / sizeof(struct hfa384x_scan_result);
263 results = kmalloc(new_count * sizeof(struct hfa384x_scan_result), 264 results = kmalloc(new_count * sizeof(struct hfa384x_hostscan_result),
264 GFP_ATOMIC); 265 GFP_ATOMIC);
265 if (results == NULL) 266 if (results == NULL)
266 return; 267 return;
267 memcpy(results, pos, new_count * sizeof(struct hfa384x_scan_result)); 268
269 /* Convert to hostscan result format. */
270 res = (struct hfa384x_scan_result *) pos;
271 for (i = 0; i < new_count; i++) {
272 memcpy(&results[i], &res[i],
273 sizeof(struct hfa384x_scan_result));
274 results[i].atim = 0;
275 }
268 276
269 spin_lock_irqsave(&local->lock, flags); 277 spin_lock_irqsave(&local->lock, flags);
270 local->last_scan_type = PRISM2_SCAN; 278 local->last_scan_type = PRISM2_SCAN;
@@ -335,9 +343,9 @@ static void prism2_info_hostscanresults(local_info_t *local,
335 343
336 spin_lock_irqsave(&local->lock, flags); 344 spin_lock_irqsave(&local->lock, flags);
337 local->last_scan_type = PRISM2_HOSTSCAN; 345 local->last_scan_type = PRISM2_HOSTSCAN;
338 prev = local->last_hostscan_results; 346 prev = local->last_scan_results;
339 local->last_hostscan_results = results; 347 local->last_scan_results = results;
340 local->last_hostscan_results_count = new_count; 348 local->last_scan_results_count = new_count;
341 spin_unlock_irqrestore(&local->lock, flags); 349 spin_unlock_irqrestore(&local->lock, flags);
342 kfree(prev); 350 kfree(prev);
343 351
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c
index 4c236e7903f5..97836198691a 100644
--- a/drivers/net/wireless/hostap/hostap_ioctl.c
+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
@@ -663,7 +663,7 @@ static int hostap_join_ap(struct net_device *dev)
663 struct hfa384x_join_request req; 663 struct hfa384x_join_request req;
664 unsigned long flags; 664 unsigned long flags;
665 int i; 665 int i;
666 struct hfa384x_scan_result *entry; 666 struct hfa384x_hostscan_result *entry;
667 667
668 iface = netdev_priv(dev); 668 iface = netdev_priv(dev);
669 local = iface->local; 669 local = iface->local;
@@ -1795,10 +1795,8 @@ static int prism2_ioctl_siwscan(struct net_device *dev,
1795 1795
1796#ifndef PRISM2_NO_STATION_MODES 1796#ifndef PRISM2_NO_STATION_MODES
1797static char * __prism2_translate_scan(local_info_t *local, 1797static char * __prism2_translate_scan(local_info_t *local,
1798 struct hfa384x_scan_result *scan, 1798 struct hfa384x_hostscan_result *scan,
1799 struct hfa384x_hostscan_result *hscan, 1799 struct hostap_bss_info *bss,
1800 int hostscan,
1801 struct hostap_bss_info *bss, u8 *bssid,
1802 char *current_ev, char *end_buf) 1800 char *current_ev, char *end_buf)
1803{ 1801{
1804 int i, chan; 1802 int i, chan;
@@ -1806,17 +1804,18 @@ static char * __prism2_translate_scan(local_info_t *local,
1806 char *current_val; 1804 char *current_val;
1807 u16 capabilities; 1805 u16 capabilities;
1808 u8 *pos; 1806 u8 *pos;
1809 u8 *ssid; 1807 u8 *ssid, *bssid;
1810 size_t ssid_len; 1808 size_t ssid_len;
1811 char *buf; 1809 char *buf;
1812 1810
1813 if (bss) { 1811 if (bss) {
1814 ssid = bss->ssid; 1812 ssid = bss->ssid;
1815 ssid_len = bss->ssid_len; 1813 ssid_len = bss->ssid_len;
1814 bssid = bss->bssid;
1816 } else { 1815 } else {
1817 ssid = hostscan ? hscan->ssid : scan->ssid; 1816 ssid = scan->ssid;
1818 ssid_len = le16_to_cpu(hostscan ? hscan->ssid_len : 1817 ssid_len = le16_to_cpu(scan->ssid_len);
1819 scan->ssid_len); 1818 bssid = scan->bssid;
1820 } 1819 }
1821 if (ssid_len > 32) 1820 if (ssid_len > 32)
1822 ssid_len = 32; 1821 ssid_len = 32;
@@ -1850,8 +1849,7 @@ static char * __prism2_translate_scan(local_info_t *local,
1850 if (bss) { 1849 if (bss) {
1851 capabilities = bss->capab_info; 1850 capabilities = bss->capab_info;
1852 } else { 1851 } else {
1853 capabilities = le16_to_cpu(hostscan ? hscan->capability : 1852 capabilities = le16_to_cpu(scan->capability);
1854 scan->capability);
1855 } 1853 }
1856 if (capabilities & (WLAN_CAPABILITY_ESS | 1854 if (capabilities & (WLAN_CAPABILITY_ESS |
1857 WLAN_CAPABILITY_IBSS)) { 1855 WLAN_CAPABILITY_IBSS)) {
@@ -1866,8 +1864,8 @@ static char * __prism2_translate_scan(local_info_t *local,
1866 1864
1867 memset(&iwe, 0, sizeof(iwe)); 1865 memset(&iwe, 0, sizeof(iwe));
1868 iwe.cmd = SIOCGIWFREQ; 1866 iwe.cmd = SIOCGIWFREQ;
1869 if (hscan || scan) { 1867 if (scan) {
1870 chan = hostscan ? hscan->chid : scan->chid; 1868 chan = scan->chid;
1871 } else if (bss) { 1869 } else if (bss) {
1872 chan = bss->chan; 1870 chan = bss->chan;
1873 } else { 1871 } else {
@@ -1882,12 +1880,12 @@ static char * __prism2_translate_scan(local_info_t *local,
1882 IW_EV_FREQ_LEN); 1880 IW_EV_FREQ_LEN);
1883 } 1881 }
1884 1882
1885 if (scan || hscan) { 1883 if (scan) {
1886 memset(&iwe, 0, sizeof(iwe)); 1884 memset(&iwe, 0, sizeof(iwe));
1887 iwe.cmd = IWEVQUAL; 1885 iwe.cmd = IWEVQUAL;
1888 if (hostscan) { 1886 if (local->last_scan_type == PRISM2_HOSTSCAN) {
1889 iwe.u.qual.level = le16_to_cpu(hscan->sl); 1887 iwe.u.qual.level = le16_to_cpu(scan->sl);
1890 iwe.u.qual.noise = le16_to_cpu(hscan->anl); 1888 iwe.u.qual.noise = le16_to_cpu(scan->anl);
1891 } else { 1889 } else {
1892 iwe.u.qual.level = 1890 iwe.u.qual.level =
1893 HFA384X_LEVEL_TO_dBm(le16_to_cpu(scan->sl)); 1891 HFA384X_LEVEL_TO_dBm(le16_to_cpu(scan->sl));
@@ -1910,11 +1908,11 @@ static char * __prism2_translate_scan(local_info_t *local,
1910 current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ""); 1908 current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, "");
1911 1909
1912 /* TODO: add SuppRates into BSS table */ 1910 /* TODO: add SuppRates into BSS table */
1913 if (scan || hscan) { 1911 if (scan) {
1914 memset(&iwe, 0, sizeof(iwe)); 1912 memset(&iwe, 0, sizeof(iwe));
1915 iwe.cmd = SIOCGIWRATE; 1913 iwe.cmd = SIOCGIWRATE;
1916 current_val = current_ev + IW_EV_LCP_LEN; 1914 current_val = current_ev + IW_EV_LCP_LEN;
1917 pos = hostscan ? hscan->sup_rates : scan->sup_rates; 1915 pos = scan->sup_rates;
1918 for (i = 0; i < sizeof(scan->sup_rates); i++) { 1916 for (i = 0; i < sizeof(scan->sup_rates); i++) {
1919 if (pos[i] == 0) 1917 if (pos[i] == 0)
1920 break; 1918 break;
@@ -1931,29 +1929,26 @@ static char * __prism2_translate_scan(local_info_t *local,
1931 1929
1932 /* TODO: add BeaconInt,resp_rate,atim into BSS table */ 1930 /* TODO: add BeaconInt,resp_rate,atim into BSS table */
1933 buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_KERNEL); 1931 buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_KERNEL);
1934 if (buf && (scan || hscan)) { 1932 if (buf && scan) {
1935 memset(&iwe, 0, sizeof(iwe)); 1933 memset(&iwe, 0, sizeof(iwe));
1936 iwe.cmd = IWEVCUSTOM; 1934 iwe.cmd = IWEVCUSTOM;
1937 sprintf(buf, "bcn_int=%d", 1935 sprintf(buf, "bcn_int=%d", le16_to_cpu(scan->beacon_interval));
1938 le16_to_cpu(hostscan ? hscan->beacon_interval :
1939 scan->beacon_interval));
1940 iwe.u.data.length = strlen(buf); 1936 iwe.u.data.length = strlen(buf);
1941 current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, 1937 current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
1942 buf); 1938 buf);
1943 1939
1944 memset(&iwe, 0, sizeof(iwe)); 1940 memset(&iwe, 0, sizeof(iwe));
1945 iwe.cmd = IWEVCUSTOM; 1941 iwe.cmd = IWEVCUSTOM;
1946 sprintf(buf, "resp_rate=%d", le16_to_cpu(hostscan ? 1942 sprintf(buf, "resp_rate=%d", le16_to_cpu(scan->rate));
1947 hscan->rate :
1948 scan->rate));
1949 iwe.u.data.length = strlen(buf); 1943 iwe.u.data.length = strlen(buf);
1950 current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, 1944 current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
1951 buf); 1945 buf);
1952 1946
1953 if (hostscan && (capabilities & WLAN_CAPABILITY_IBSS)) { 1947 if (local->last_scan_type == PRISM2_HOSTSCAN &&
1948 (capabilities & WLAN_CAPABILITY_IBSS)) {
1954 memset(&iwe, 0, sizeof(iwe)); 1949 memset(&iwe, 0, sizeof(iwe));
1955 iwe.cmd = IWEVCUSTOM; 1950 iwe.cmd = IWEVCUSTOM;
1956 sprintf(buf, "atim=%d", le16_to_cpu(hscan->atim)); 1951 sprintf(buf, "atim=%d", le16_to_cpu(scan->atim));
1957 iwe.u.data.length = strlen(buf); 1952 iwe.u.data.length = strlen(buf);
1958 current_ev = iwe_stream_add_point(current_ev, end_buf, 1953 current_ev = iwe_stream_add_point(current_ev, end_buf,
1959 &iwe, buf); 1954 &iwe, buf);
@@ -1986,12 +1981,10 @@ static char * __prism2_translate_scan(local_info_t *local,
1986static inline int prism2_translate_scan(local_info_t *local, 1981static inline int prism2_translate_scan(local_info_t *local,
1987 char *buffer, int buflen) 1982 char *buffer, int buflen)
1988{ 1983{
1989 struct hfa384x_scan_result *scan; 1984 struct hfa384x_hostscan_result *scan;
1990 struct hfa384x_hostscan_result *hscan; 1985 int entry, hostscan;
1991 int entries, entry, hostscan;
1992 char *current_ev = buffer; 1986 char *current_ev = buffer;
1993 char *end_buf = buffer + buflen; 1987 char *end_buf = buffer + buflen;
1994 u8 *bssid;
1995 struct list_head *ptr; 1988 struct list_head *ptr;
1996 1989
1997 spin_lock_bh(&local->lock); 1990 spin_lock_bh(&local->lock);
@@ -2003,14 +1996,9 @@ static inline int prism2_translate_scan(local_info_t *local,
2003 } 1996 }
2004 1997
2005 hostscan = local->last_scan_type == PRISM2_HOSTSCAN; 1998 hostscan = local->last_scan_type == PRISM2_HOSTSCAN;
2006 entries = hostscan ? local->last_hostscan_results_count : 1999 for (entry = 0; entry < local->last_scan_results_count; entry++) {
2007 local->last_scan_results_count;
2008 for (entry = 0; entry < entries; entry++) {
2009 int found = 0; 2000 int found = 0;
2010 scan = &local->last_scan_results[entry]; 2001 scan = &local->last_scan_results[entry];
2011 hscan = &local->last_hostscan_results[entry];
2012
2013 bssid = hostscan ? hscan->bssid : scan->bssid;
2014 2002
2015 /* Report every SSID if the AP is using multiple SSIDs. If no 2003 /* Report every SSID if the AP is using multiple SSIDs. If no
2016 * BSS record is found (e.g., when WPA mode is disabled), 2004 * BSS record is found (e.g., when WPA mode is disabled),
@@ -2018,18 +2006,16 @@ static inline int prism2_translate_scan(local_info_t *local,
2018 list_for_each(ptr, &local->bss_list) { 2006 list_for_each(ptr, &local->bss_list) {
2019 struct hostap_bss_info *bss; 2007 struct hostap_bss_info *bss;
2020 bss = list_entry(ptr, struct hostap_bss_info, list); 2008 bss = list_entry(ptr, struct hostap_bss_info, list);
2021 if (memcmp(bss->bssid, bssid, ETH_ALEN) == 0) { 2009 if (memcmp(bss->bssid, scan->bssid, ETH_ALEN) == 0) {
2022 bss->included = 1; 2010 bss->included = 1;
2023 current_ev = __prism2_translate_scan( 2011 current_ev = __prism2_translate_scan(
2024 local, scan, hscan, hostscan, bss, 2012 local, scan, bss, current_ev, end_buf);
2025 bssid, current_ev, end_buf);
2026 found++; 2013 found++;
2027 } 2014 }
2028 } 2015 }
2029 if (!found) { 2016 if (!found) {
2030 current_ev = __prism2_translate_scan( 2017 current_ev = __prism2_translate_scan(
2031 local, scan, hscan, hostscan, NULL, bssid, 2018 local, scan, NULL, current_ev, end_buf);
2032 current_ev, end_buf);
2033 } 2019 }
2034 /* Check if there is space for one more entry */ 2020 /* Check if there is space for one more entry */
2035 if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) { 2021 if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
@@ -2047,9 +2033,8 @@ static inline int prism2_translate_scan(local_info_t *local,
2047 bss = list_entry(ptr, struct hostap_bss_info, list); 2033 bss = list_entry(ptr, struct hostap_bss_info, list);
2048 if (bss->included) 2034 if (bss->included)
2049 continue; 2035 continue;
2050 current_ev = __prism2_translate_scan(local, NULL, NULL, 0, bss, 2036 current_ev = __prism2_translate_scan(local, NULL, bss,
2051 bss->bssid, current_ev, 2037 current_ev, end_buf);
2052 end_buf);
2053 /* Check if there is space for one more entry */ 2038 /* Check if there is space for one more entry */
2054 if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) { 2039 if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
2055 /* Ask user space to try again with a bigger buffer */ 2040 /* Ask user space to try again with a bigger buffer */
diff --git a/drivers/net/wireless/hostap/hostap_proc.c b/drivers/net/wireless/hostap/hostap_proc.c
index 81b321ba189a..a0a4cbd4937a 100644
--- a/drivers/net/wireless/hostap/hostap_proc.c
+++ b/drivers/net/wireless/hostap/hostap_proc.c
@@ -302,20 +302,15 @@ static int prism2_scan_results_proc_read(char *page, char **start, off_t off,
302{ 302{
303 char *p = page; 303 char *p = page;
304 local_info_t *local = (local_info_t *) data; 304 local_info_t *local = (local_info_t *) data;
305 int entries, entry, i, len, total = 0, hostscan; 305 int entry, i, len, total = 0;
306 struct hfa384x_scan_result *scanres; 306 struct hfa384x_hostscan_result *scanres;
307 struct hfa384x_hostscan_result *hscanres;
308 u8 *pos; 307 u8 *pos;
309 308
310 p += sprintf(p, "CHID ANL SL BcnInt Capab Rate BSSID ATIM SupRates " 309 p += sprintf(p, "CHID ANL SL BcnInt Capab Rate BSSID ATIM SupRates "
311 "SSID\n"); 310 "SSID\n");
312 311
313 spin_lock_bh(&local->lock); 312 spin_lock_bh(&local->lock);
314 hostscan = local->last_scan_type == PRISM2_HOSTSCAN; 313 for (entry = 0; entry < local->last_scan_results_count; entry++) {
315 entries = hostscan ? local->last_hostscan_results_count :
316 local->last_scan_results_count;
317 for (entry = 0; entry < entries; entry++) {
318 hscanres = &local->last_hostscan_results[entry];
319 scanres = &local->last_scan_results[entry]; 314 scanres = &local->last_scan_results[entry];
320 315
321 if (total + (p - page) <= off) { 316 if (total + (p - page) <= off) {
@@ -327,39 +322,26 @@ static int prism2_scan_results_proc_read(char *page, char **start, off_t off,
327 if ((p - page) > (PAGE_SIZE - 200)) 322 if ((p - page) > (PAGE_SIZE - 200))
328 break; 323 break;
329 324
330 if (hostscan) { 325 p += sprintf(p, "%d %d %d %d 0x%02x %d " MACSTR " %d ",
331 p += sprintf(p, "%d %d %d %d 0x%02x %d " MACSTR " %d ", 326 le16_to_cpu(scanres->chid),
332 le16_to_cpu(hscanres->chid), 327 (s16) le16_to_cpu(scanres->anl),
333 (s16) le16_to_cpu(hscanres->anl), 328 (s16) le16_to_cpu(scanres->sl),
334 (s16) le16_to_cpu(hscanres->sl), 329 le16_to_cpu(scanres->beacon_interval),
335 le16_to_cpu(hscanres->beacon_interval), 330 le16_to_cpu(scanres->capability),
336 le16_to_cpu(hscanres->capability), 331 le16_to_cpu(scanres->rate),
337 le16_to_cpu(hscanres->rate), 332 MAC2STR(scanres->bssid),
338 MAC2STR(hscanres->bssid), 333 le16_to_cpu(scanres->atim));
339 le16_to_cpu(hscanres->atim)); 334
340 } else { 335 pos = scanres->sup_rates;
341 p += sprintf(p, "%d %d %d %d 0x%02x %d " MACSTR 336 for (i = 0; i < sizeof(scanres->sup_rates); i++) {
342 " N/A ",
343 le16_to_cpu(scanres->chid),
344 (s16) le16_to_cpu(scanres->anl),
345 (s16) le16_to_cpu(scanres->sl),
346 le16_to_cpu(scanres->beacon_interval),
347 le16_to_cpu(scanres->capability),
348 le16_to_cpu(scanres->rate),
349 MAC2STR(scanres->bssid));
350 }
351
352 pos = hostscan ? hscanres->sup_rates : scanres->sup_rates;
353 for (i = 0; i < sizeof(hscanres->sup_rates); i++) {
354 if (pos[i] == 0) 337 if (pos[i] == 0)
355 break; 338 break;
356 p += sprintf(p, "<%02x>", pos[i]); 339 p += sprintf(p, "<%02x>", pos[i]);
357 } 340 }
358 p += sprintf(p, " "); 341 p += sprintf(p, " ");
359 342
360 pos = hostscan ? hscanres->ssid : scanres->ssid; 343 pos = scanres->ssid;
361 len = le16_to_cpu(hostscan ? hscanres->ssid_len : 344 len = le16_to_cpu(scanres->ssid_len);
362 scanres->ssid_len);
363 if (len > 32) 345 if (len > 32)
364 len = 32; 346 len = 32;
365 for (i = 0; i < len; i++) { 347 for (i = 0; i < len; i++) {
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h
index 91beee50c9c9..03de0ea80bbd 100644
--- a/drivers/net/wireless/hostap/hostap_wlan.h
+++ b/drivers/net/wireless/hostap/hostap_wlan.h
@@ -824,10 +824,8 @@ struct local_info {
824 824
825 int host_roaming; 825 int host_roaming;
826 unsigned long last_join_time; /* time of last JoinRequest */ 826 unsigned long last_join_time; /* time of last JoinRequest */
827 struct hfa384x_scan_result *last_scan_results; 827 struct hfa384x_hostscan_result *last_scan_results;
828 int last_scan_results_count; 828 int last_scan_results_count;
829 struct hfa384x_hostscan_result *last_hostscan_results;
830 int last_hostscan_results_count;
831 enum { PRISM2_SCAN, PRISM2_HOSTSCAN } last_scan_type; 829 enum { PRISM2_SCAN, PRISM2_HOSTSCAN } last_scan_type;
832 struct work_struct info_queue; 830 struct work_struct info_queue;
833 long pending_info; /* bit field of pending info_queue items */ 831 long pending_info; /* bit field of pending info_queue items */