Re: DTIM (Power Save Mode) w/ HostAP

"Kevin Lahey" <[email protected]> Wed, 19 Mar 2003 16:23:22 -0800
Newsgroups gmane.network.wireless.bsd.general
Message-ID <[email protected]>
This is a multi-part message in MIME format.

--Multipart_Wed__19_Mar_2003_16:19:29_-0800_08161400
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

On Fri, 14 Mar 2003 15:26:19 -0800
Matt Peterson <[email protected]> wrote:

> I've emailed the usual BSD driver developers, many of which have crammed 
> schedules.  Anyone else available to fix this up in FreeBSD?

Well, I've attached a patch that make power saving work for the
NetBSD-current.  My understanding is that the FreeBSD-current
wireless drivers are substantially similar, so we could probably
get something working pretty easily.

I offer this patch without a whole lot of testing;  it appears to
work with Lucent and PRISM2 cards on NetBSD systems.  I had a discussion
with Matt off-line in which he suggested that several folks were
anxious to play with the patch, so I went ahead and posted it.  If people
try it out, I'd love to hear about any issues that come up.

There are still some issues to resolve:

* AID allocation is pretty clunky.  I iterate through all of the
  attached STAs to verify that a new AID is unique.  This is
  grossly inefficient and could really break down under a high
  load.  This should really be rewritten to use a bitmap.

* There is no limit on the number of packets that will be saved
  for a STA in power save mode.  We should certainly have some limit
  to prevent some sort of DoS attack.  the 802.11 spec requires us to 
  store packets for at least the listen interval specified when the 
  STA associates.  I don't think that we keep track of the listen
  interval right now.  We should probably reject association attempts
  with ridiculous listen intervals.

* AID allocation is flat out broken -- I noticed while preparing this
  message that after 2007 AIDs are handed out, I fail to reset the
  AID counter.  I figured it was better to get the patch out and fix
  that later.

Kevin
[email protected]
--Multipart_Wed__19_Mar_2003_16:19:29_-0800_08161400
Content-Type: application/octet-stream;
 name="ps-hostap-diffs"
Content-Disposition: attachment;
 filename="ps-hostap-diffs"
Content-Transfer-Encoding: base64

SW5kZXg6IG5ldC9pZl9pZWVlODAyMTEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9z
cmMvc3lzL25ldC9pZl9pZWVlODAyMTEuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yNgpkaWZm
IC1jIC1yMS4yNiBpZl9pZWVlODAyMTEuaAoqKiogbmV0L2lmX2llZWU4MDIxMS5oCTIwMDMvMDIv
MjUgMDE6NTc6MzUJMS4yNgotLS0gbmV0L2lmX2llZWU4MDIxMS5oCTIwMDMvMDMvMTkgMjE6MjA6
MzUKKioqKioqKioqKioqKioqCioqKiA0MTcsNDIyICoqKioKLS0tIDQxNyw0MjcgLS0tLQogIAl1
X2ludDE2X3QJCW5pX2ZoZHdlbGw7CS8qIEZIIG9ubHkgKi8KICAJdV9pbnQ4X3QJCW5pX2ZoaW5k
ZXg7CS8qIEZIIG9ubHkgKi8KICAKKyAJLyogcG93ZXIgc2F2aW5nIG1vZGUgKi8KKyAKKyAJdV9p
bnQ4X3QJCW5pX3B3cnNhdmU7CisgCXN0cnVjdCBpZnF1ZXVlCQluaV9zYXZlZHE7CS8qIHBhY2tl
dHMgd2FpdGluZyBmb3IgcHNwb2xsICovCisgCiAgCS8qIG90aGVycyAqLwogIAl1X2ludDE2X3QJ
CW5pX2Fzc29jaWQ7CS8qIGFzc29jIHJlc3BvbnNlICovCiAgCXVfaW50MTZfdAkJbmlfdHhzZXE7
CS8qIHNlcSB0byBiZSB0cmFuc21pdHRlZCAqLwoqKioqKioqKioqKioqKioKKioqIDQzMyw0Mzgg
KioqKgotLS0gNDM4LDQ0NSAtLS0tCiAgI2RlZmluZQlJRUVFODAyMTFfRkhfQ0hBTlNFVChjaGFu
KQkoKGNoYW4pL0lFRUU4MDIxMV9GSF9DSEFOTU9EKzEpCiAgI2RlZmluZQlJRUVFODAyMTFfRkhf
Q0hBTlBBVChjaGFuKQkoKGNoYW4pJUlFRUU4MDIxMV9GSF9DSEFOTU9EKQogIAorICNkZWZpbmUg
SUVFRTgwMjExX1BXUl9TTEVFUAkweDEJLyogU1RBIGlzIGluIHBvd2VyIHNhdmluZyBtb2RlICov
CisgCiAgc3RydWN0IGllZWU4MDIxMV93ZXBrZXkgewogIAlpbnQJCQl3a19sZW47CiAgCXVfaW50
OF90CQl3a19rZXlbSUVFRTgwMjExX0tFWUJVRl9TSVpFXTsKKioqKioqKioqKioqKioqCioqKiA0
NDYsNDU2ICoqKioKLS0tIDQ1Myw0NjUgLS0tLQogIAkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9u
b2RlICosIGludCwgaW50KTsKICAJaW50CQkJKCppY19uZXdzdGF0ZSkodm9pZCAqLCBlbnVtIGll
ZWU4MDIxMV9zdGF0ZSk7CiAgCWludAkJCSgqaWNfY2hhbmNoZWNrKSh2b2lkICosIHVfY2hhciAq
KTsKKyAJaW50CQkJKCppY19zZXRfdGltKShzdHJ1Y3QgaWVlZTgwMjExY29tICosIGludCwgaW50
KTsKICAJdV9pbnQ4X3QJCWljX215YWRkcltJRUVFODAyMTFfQUREUl9MRU5dOwogIAl1X2ludDhf
dAkJaWNfc3VwX3JhdGVzW0lFRUU4MDIxMV9SQVRFX1NJWkVdOwogIAl1X2NoYXIJCQlpY19jaGFu
X2F2YWlsW3JvdW5kdXAoSUVFRTgwMjExX0NIQU5fTUFYLE5CQlkpXTsKICAJdV9jaGFyCQkJaWNf
Y2hhbl9hY3RpdmVbcm91bmR1cChJRUVFODAyMTFfQ0hBTl9NQVgsIE5CQlkpXTsKICAJc3RydWN0
IGlmcXVldWUJCWljX21ndHE7CisgCXN0cnVjdCBpZnF1ZXVlCQlpY19wd3JzYXZlcTsKICAJaW50
CQkJaWNfZmxhZ3M7CiAgCWVudW0gaWVlZTgwMjExX3BoeXR5cGUJaWNfcGh5dHlwZTsKICAJZW51
bSBpZWVlODAyMTFfb3Btb2RlCWljX29wbW9kZTsKKioqKioqKioqKioqKioqCioqKiA1MzgsNTQz
ICoqKioKLS0tIDU0Nyw1NTUgLS0tLQogIAogIGludAlpZWVlODAyMTFfY2ZnZ2V0KHN0cnVjdCBp
Zm5ldCAqLCB1X2xvbmcsIGNhZGRyX3QpOwogIGludAlpZWVlODAyMTFfY2Znc2V0KHN0cnVjdCBp
Zm5ldCAqLCB1X2xvbmcsIGNhZGRyX3QpOworIAorIHZvaWQJaWVlZTgwMjExX3B3cnNhdmUoc3Ry
dWN0IGllZWU4MDIxMWNvbSAqLCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgCisgCQkJICBzdHJ1
Y3QgbWJ1ZiAqKTsKICAKICAjZW5kaWYgLyogX0tFUk5FTCAqLwogIApJbmRleDogbmV0L2lmX2ll
ZWU4MDIxMXN1YnIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMvc3lzL25ldC9p
Zl9pZWVlODAyMTFzdWJyLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjQKZGlmZiAtYyAtcjEu
MjQgaWZfaWVlZTgwMjExc3Vici5jCioqKiBuZXQvaWZfaWVlZTgwMjExc3Vici5jCTIwMDMvMDIv
MjUgMDE6NTc6MzYJMS4yNAotLS0gbmV0L2lmX2llZWU4MDIxMXN1YnIuYwkyMDAzLzAzLzE5IDIx
OjIwOjQwCioqKioqKioqKioqKioqKgoqKiogMTE4LDEyNSAqKioqCi0tLSAxMTgsMTI5IC0tLS0K
ICBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVjdl9kZWF1dGgoc3RydWN0IGllZWU4MDIxMWNvbSAq
LAogICAgICBzdHJ1Y3QgbWJ1ZiAqLCBpbnQsIHVfaW50MzJfdCk7CiAgCisgc3RhdGljIHZvaWQg
aWVlZTgwMjExX3JlY3ZfcHNwb2xsKHN0cnVjdCBpZWVlODAyMTFjb20gKiwKKyAgICAgc3RydWN0
IG1idWYgKiwgaW50LCB1X2ludDMyX3QpOworIAogIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9jcmNf
aW5pdCh2b2lkKTsKICBzdGF0aWMgdV9pbnQzMl90IGllZWU4MDIxMV9jcmNfdXBkYXRlKHVfaW50
MzJfdCwgdV9pbnQ4X3QgKiwgaW50KTsKKyBzdGF0aWMgaW50IGllZWU4MDIxMV9haWRfdW5pcXVl
KHN0cnVjdCBpZWVlODAyMTFjb20gKiwgdV9pbnQxNl90KTsKICAKICBzdGF0aWMgY29uc3QgY2hh
ciAqaWVlZTgwMjExX21ndF9zdWJ0eXBlX25hbWVbXSA9IHsKICAJImFzc29jX3JlcSIsCSJhc3Nv
Y19yZXNwIiwJInJlYXNzb2NfcmVxIiwJInJlYXNzb2NfcmVzcCIsCioqKioqKioqKioqKioqKgoq
KiogMjE1LDIyMCAqKioqCi0tLSAyMTksMjI1IC0tLS0KICAKICAJcyA9IHNwbG5ldCgpOwogIAlJ
Rl9QVVJHRSgmaWMtPmljX21ndHEpOworIAlJRl9QVVJHRSgmaWMtPmljX3B3cnNhdmVxKTsKICAJ
aWYgKGljLT5pY193ZXBfY3R4ICE9IE5VTEwpIHsKICAJCWZyZWUoaWMtPmljX3dlcF9jdHgsIE1f
REVWQlVGKTsKICAJCWljLT5pY193ZXBfY3R4ID0gTlVMTDsKKioqKioqKioqKioqKioqCioqKiAy
NzUsMjgxICoqKioKICAJCQllbHNlCiAgCQkJCWJzc2lkID0gd2gtPmlfYWRkcjE7CiAgCQkJaWYg
KCFJRUVFODAyMTFfQUREUl9FUShic3NpZCwgaWMtPmljX2Jzcy5uaV9ic3NpZCkgJiYKISAJCQkg
ICAgIUlFRUU4MDIxMV9BRERSX0VRKGJzc2lkLCBpZnAtPmlmX2Jyb2FkY2FzdGFkZHIpKSB7CiAg
CQkJCS8qIG5vdCBpbnRlcmVzdGVkIGluICovCiAgCQkJCURQUklOVEYyKCgiaWVlZTgwMjExX2lu
cHV0OiBvdGhlciBic3MgJXNcbiIsCiAgCQkJCSAgICBldGhlcl9zcHJpbnRmKHdoLT5pX2FkZHIz
KSkpOwotLS0gMjgwLDI4OCAtLS0tCiAgCQkJZWxzZQogIAkJCQlic3NpZCA9IHdoLT5pX2FkZHIx
OwogIAkJCWlmICghSUVFRTgwMjExX0FERFJfRVEoYnNzaWQsIGljLT5pY19ic3MubmlfYnNzaWQp
ICYmCiEgCQkJICAgICFJRUVFODAyMTFfQUREUl9FUShic3NpZCwgaWZwLT5pZl9icm9hZGNhc3Rh
ZGRyKSAmJgohIAkJCSAgICAod2gtPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSykg
IT0KISAJCQkgICAgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCkgewogIAkJCQkvKiBub3QgaW50ZXJl
c3RlZCBpbiAqLwogIAkJCQlEUFJJTlRGMigoImllZWU4MDIxMV9pbnB1dDogb3RoZXIgYnNzICVz
XG4iLAogIAkJCQkgICAgZXRoZXJfc3ByaW50Zih3aC0+aV9hZGRyMykpKTsKKioqKioqKioqKioq
KioqCioqKiAzMDUsMzEwICoqKioKLS0tIDMxMiwzNDcgLS0tLQogIAkJbmktPm5pX2luYWN0ID0g
MDsKICAJfQogIAorIAlpZiAoKHdoLT5pX2ZjWzFdICYgSUVFRTgwMjExX0ZDMV9QV1JfTUdUKSAm
JiBuaS0+bmlfcHdyc2F2ZSA9PSAwKSB7CisgCQkvKiB0dXJuIG9uIHBvd2VyIHNhdmUgbW9kZSAq
LworIAorIAkJaWYgKGlmcC0+aWZfZmxhZ3MgJiBJRkZfREVCVUcpCisgCQkJcHJpbnRmKCIlczog
cG93ZXIgc2F2ZSBtb2RlIG9uIGZvciAlc1xuIiwKKyAJCQkgICAgaWZwLT5pZl94bmFtZSwgZXRo
ZXJfc3ByaW50Zih3aC0+aV9hZGRyMikpOworIAorIAkJbmktPm5pX3B3cnNhdmUgPSBJRUVFODAy
MTFfUFdSX1NMRUVQOworIAl9CisgCWlmICgod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX1BX
Ul9NR1QpID09IDAgICYmIAorIAkgICAgbmktPm5pX3B3cnNhdmUgIT0gMCkgeworIAkJLyogdHVy
biBvZmYgcG93ZXIgc2F2ZSBtb2RlLCBkZXF1ZXVlIHN0b3JlZCBwYWNrZXRzICovCisgCisgCQlz
dHJ1Y3QgbWJ1ZiAqbTsKKyAKKyAJCW5pLT5uaV9wd3JzYXZlID0gMDsKKyAJCWlmIChpYy0+aWNf
c2V0X3RpbSkgCisgCQkJaWMtPmljX3NldF90aW0oaWMsIG5pLT5uaV9hc3NvY2lkLCAwKTsKKyAK
KyAJCWlmIChpZnAtPmlmX2ZsYWdzICYgSUZGX0RFQlVHKQorIAkJCXByaW50ZigiJXM6IHBvd2Vy
IHNhdmUgbW9kZSBvZmYgZm9yICVzXG4iLAorIAkJCSAgICBpZnAtPmlmX3huYW1lLCBldGhlcl9z
cHJpbnRmKHdoLT5pX2FkZHIxKSk7CisgCisgCQl3aGlsZSAoIUlGX0lTX0VNUFRZKCZuaS0+bmlf
c2F2ZWRxKSkgeworIAkJCUlGX0RFUVVFVUUoJm5pLT5uaV9zYXZlZHEsIG0pOworIAkJCUlGX0VO
UVVFVUUoJmljLT5pY19wd3JzYXZlcSwgbSk7CisgCQkJKCppZnAtPmlmX3N0YXJ0KShpZnApOwor
IAkJfQorIAl9CisgCiAgCXN3aXRjaCAod2gtPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1RZUEVf
TUFTSykgewogIAljYXNlIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBOgogIAkJc3dpdGNoIChpYy0+
aWNfb3Btb2RlKSB7CioqKioqKioqKioqKioqKgoqKiogNDgyLDQ4NyAqKioqCi0tLSA1MTksNTM3
IC0tLS0KICAJCXJldHVybjsKICAKICAJY2FzZSBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMOgorIAkJ
aWYgKGljLT5pY19vcG1vZGUgIT0gSUVFRTgwMjExX01fSE9TVEFQKQorIAkJCWdvdG8gb3V0Owor
IAkJc3VidHlwZSA9IHdoLT5pX2ZjWzBdICYgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0s7Cisg
CQlpZiAoc3VidHlwZSA9PSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFNfUE9MTCkgeworIAkJCS8q
IER1bXAgb3V0IGEgc2luZ2xlIHBhY2tldCBmcm9tIHRoZSBob3N0ICovCisgCQkJaWYgKGlmcC0+
aWZfZmxhZ3MgJiBJRkZfREVCVUcpCisgCQkJCXByaW50ZigiJXM6IGdvdCBwb3dlciBzYXZlIHBy
b2JlIGZyb20gJXNcbiIsCisgCQkJCSAgICAgICBpZnAtPmlmX3huYW1lLCAKKyAJCQkJICAgICAg
IGV0aGVyX3NwcmludGYod2gtPmlfYWRkcjIpKTsKKyAJCQlpZWVlODAyMTFfcmVjdl9wc3BvbGwo
aWMsIG0sIHJzc2ksIHJzdGFtcCk7CisgCQl9CisgCQlnb3RvIG91dDsKKyAKICAJZGVmYXVsdDoK
ICAJCURQUklOVEYoKCJpZWVlODAyMTFfaW5wdXQ6IGJhZCB0eXBlICV4XG4iLCB3aC0+aV9mY1sw
XSkpOwogIAkJLyogc2hvdWxkIG5vdCBjb21lIGhlcmUgKi8KKioqKioqKioqKioqKioqCioqKiAx
MzA1LDEzMTAgKioqKgotLS0gMTM1NSwxMzY1IC0tLS0KICAJCSgqaWMtPmljX25vZGVfZnJlZSko
aWMsIG5pKTsKICAJVEFJTFFfUkVNT1ZFKCZpYy0+aWNfbm9kZSwgbmksIG5pX2xpc3QpOwogIAlM
SVNUX1JFTU9WRShuaSwgbmlfaGFzaCk7CisgCWlmICghSUZfSVNfRU1QVFkoJm5pLT5uaV9zYXZl
ZHEpKSB7CisgCQlJRl9QVVJHRSgmbmktPm5pX3NhdmVkcSk7CisgCQlpZiAoaWMtPmljX3NldF90
aW0pCisgCQkJaWMtPmljX3NldF90aW0oaWMsIG5pLT5uaV9hc3NvY2lkLCAwKTsKKyAJfQogIAlz
cGx4KHMpOwogIAlmcmVlKG5pLCBNX0RFVkJVRik7CiAgCWlmIChUQUlMUV9FTVBUWSgmaWMtPmlj
X25vZGUpKQoqKioqKioqKioqKioqKioKKioqIDEzNzksMTM4NSAqKioqCi0tLSAxNDM0LDE0NjQg
LS0tLQogIAlyZXR1cm4gb2tyYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMOwogIH0KICAKKyB2b2lk
CisgaWVlZTgwMjExX3B3cnNhdmUoc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIHN0cnVjdCBpZWVl
ODAyMTFfbm9kZSAqbmksIAorIAkJICBzdHJ1Y3QgbWJ1ZiAqbSkKKyB7CisgCS8qIFN0b3JlIHRo
ZSBuZXcgcGFja2V0IG9uIG91ciBxdWV1ZSwgY2hhbmdpbmcgdGhlIFRJTSBpZiBuZWNlc3Nhcnkg
Ki8KKyAKKyAJaWYgKElGX0lTX0VNUFRZKCZuaS0+bmlfc2F2ZWRxKSkgeworIAkJaWMtPmljX3Nl
dF90aW0oaWMsIG5pLT5uaV9hc3NvY2lkLCAxKTsKKyAJfQorIAlJRl9FTlFVRVVFKCZuaS0+bmlf
c2F2ZWRxLCBtKTsKKyB9CisgCiAgc3RhdGljIGludAorIGllZWU4MDIxMV9haWRfdW5pcXVlKHN0
cnVjdCBpZWVlODAyMTFjb20gKmljLCB1X2ludDE2X3QgYXNzb2NpZCkKKyB7CisgCXN0cnVjdCBp
ZWVlODAyMTFfbm9kZSAqbmk7CisgCisgCVRBSUxRX0ZPUkVBQ0gobmksICZpYy0+aWNfbm9kZSwg
bmlfbGlzdCkgeworIAkJaWYgKG5pLT5uaV9hc3NvY2lkID09IGFzc29jaWQpCisgCQkJcmV0dXJu
IDA7CisgCX0KKyAJcmV0dXJuIDE7CisgfQorIAorIHN0YXRpYyBpbnQKICBpZWVlODAyMTFfc2Vu
ZF9wcnJlcShzdHJ1Y3QgaWVlZTgwMjExY29tICppYywgc3RydWN0IGllZWU4MDIxMV9ub2RlICpu
aSwKICAgICAgaW50IHR5cGUsIGludCBkdW1teSkKICB7CioqKioqKioqKioqKioqKgoqKiogMjA1
OCwyMDY1ICoqKioKICAJbmktPm5pX2ZoZHdlbGwgPSBpYy0+aWNfYnNzLm5pX2ZoZHdlbGw7CiAg
CW5pLT5uaV9maGluZGV4ID0gaWMtPmljX2Jzcy5uaV9maGluZGV4OwogIAlpZiAobmktPm5pX2Fz
c29jaWQgPT0gMCkgewohIAkJbmktPm5pX2Fzc29jaWQgPSAweGMwMDAgfCBpYy0+aWNfYnNzLm5p
X2Fzc29jaWQrKzsKISAJCW5ld2Fzc29jID0gMTsKICAJfSBlbHNlCiAgCQluZXdhc3NvYyA9IDA7
CiAgCUlFRUU4MDIxMV9TRU5EX01HTVQoaWMsIG5pLCByZXNwLCBJRUVFODAyMTFfU1RBVFVTX1NV
Q0NFU1MpOwotLS0gMjEzNywyMTU5IC0tLS0KICAJbmktPm5pX2ZoZHdlbGwgPSBpYy0+aWNfYnNz
Lm5pX2ZoZHdlbGw7CiAgCW5pLT5uaV9maGluZGV4ID0gaWMtPmljX2Jzcy5uaV9maGluZGV4Owog
IAlpZiAobmktPm5pX2Fzc29jaWQgPT0gMCkgewohIAkJdV9pbnQxNl90IGZpcnN0ID0gaWMtPmlj
X2Jzcy5uaV9hc3NvY2lkOwohIAkJdV9pbnQxNl90IGFpZCA9IDB4YzAwMCB8IGljLT5pY19ic3Mu
bmlfYXNzb2NpZCsrOwohIAohIAkJLyogWFhYOiAgdGhpcyBpcyByaWRpY3Vsb3VzbHkgc2xvdyB1
bmRlciBoZWF2eSBsb2FkISAqLwohIAkJd2hpbGUgKChpZWVlODAyMTFfYWlkX3VuaXF1ZShpYywg
YWlkKSA9PSAwICYmCiEgCQkgICAgICAgIGljLT5pY19ic3MubmlfYXNzb2NpZCAhPSBmaXJzdCkg
fHwgCiEgCQkJaWMtPmljX2Jzcy5uaV9hc3NvY2lkID09IDApCiEgCQkJYWlkID0gMHhjMDAwIHwg
aWMtPmljX2Jzcy5uaV9hc3NvY2lkKys7CiEgCiEgCQlpZiAoaWMtPmljX2Jzcy5uaV9hc3NvY2lk
ID09IGZpcnN0KSB7CiEgCQkJSUVFRTgwMjExX1NFTkRfTUdNVChpYywgbmksIHJlc3AsCiEgCQkJ
CQkgICAgSUVFRTgwMjExX1JFQVNPTl9BU1NPQ19UT09NQU5ZKTsKISAJCQlyZXR1cm47CiEgCQl9
IGVsc2UgewohIAkJCW5pLT5uaV9hc3NvY2lkID0gYWlkOwohIAkJCW5ld2Fzc29jID0gMTsKISAJ
CX0KICAJfSBlbHNlCiAgCQluZXdhc3NvYyA9IDA7CiAgCUlFRUU4MDIxMV9TRU5EX01HTVQoaWMs
IG5pLCByZXNwLCBJRUVFODAyMTFfU1RBVFVTX1NVQ0NFU1MpOwoqKioqKioqKioqKioqKioKKioq
IDIyMTEsMjIxNiAqKioqCi0tLSAyMzA1LDIzNzggLS0tLQogIAl9CiAgfQogIAorIAorIHN0YXRp
YyB2b2lkCisgaWVlZTgwMjExX3JlY3ZfcHNwb2xsKHN0cnVjdCBpZWVlODAyMTFjb20gKmljLCBz
dHJ1Y3QgbWJ1ZiAqbTAsIGludCByc3NpLAorIAkJICAgICAgdV9pbnQzMl90IHJzdGFtcCkKKyB7
CisgCXN0cnVjdCBpZm5ldCAqaWZwID0gJmljLT5pY19pZjsKKyAJc3RydWN0IGllZWU4MDIxMV9m
cmFtZSAqd2g7CisgCXN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmk7CisgCXN0cnVjdCBtYnVmICpt
OworIAl1X2ludDE2X3QgYWlkOworIAorIAl3aCA9IG10b2QobTAsIHN0cnVjdCBpZWVlODAyMTFf
ZnJhbWUgKik7CisgCisgCWlmICgobmkgPSBpZWVlODAyMTFfZmluZF9ub2RlKGljLCB3aC0+aV9h
ZGRyMikpID09IE5VTEwpIHsKKyAJCWlmIChpZnAtPmlmX2ZsYWdzICYgSUZGX0RFQlVHKQorIAkJ
CXByaW50ZigiJXM6IHN0YXRpb24gJXMgc2VudCBib2d1cyBwb3dlciBzYXZlIHBvbGxcbiIsCisg
CQkJICAgICAgIGlmcC0+aWZfeG5hbWUsIGV0aGVyX3NwcmludGYod2gtPmlfYWRkcjIpKTsKKyAJ
CXJldHVybjsKKyAJfQorIAorIAltZW1jcHkoJmFpZCwgd2gtPmlfZHVyLCBzaXplb2Yod2gtPmlf
ZHVyKSk7CisgCWlmICgoYWlkICYgMHhjMDAwKSAhPSAweGMwMDApIHsKKyAJCWlmIChpZnAtPmlm
X2ZsYWdzICYgSUZGX0RFQlVHKQorIAkJCXByaW50ZigiJXM6IHN0YXRpb24gJXMgc2VudCBib2d1
cyBhaWQgJXhcbiIsCisgCQkJICAgICAgIGlmcC0+aWZfeG5hbWUsIGV0aGVyX3NwcmludGYod2gt
PmlfYWRkcjIpLCBhaWQpOworIAkJcmV0dXJuOworIAl9CisgCisgCWlmIChhaWQgIT0gbmktPm5p
X2Fzc29jaWQpIHsKKyAJCWlmIChpZnAtPmlmX2ZsYWdzICYgSUZGX0RFQlVHKQorIAkJCXByaW50
ZigiJXM6IHN0YXRpb24gJXMgYWlkICV4IGRvZXNuJ3QgbWF0Y2ggcHNwb2xsIGFpZCAleFxuIiwK
KyAJCQkgICAgICAgaWZwLT5pZl94bmFtZSwgZXRoZXJfc3ByaW50Zih3aC0+aV9hZGRyMiksCisg
CQkJICAgICAgIG5pLT5uaV9hc3NvY2lkLCBhaWQpOworIAkJcmV0dXJuOworIAl9CisgCisgCS8q
IE9rYXksIHRha2UgdGhlIGZpcnN0IHF1ZXVlZCBwYWNrZXQgYW5kIHB1dCBpdCBvdXQuLi4gKi8K
KyAKKyAJSUZfREVRVUVVRSgmbmktPm5pX3NhdmVkcSwgbSk7CisgCWlmIChtID09IE5VTEwpIHsK
KyAJCWlmIChpZnAtPmlmX2ZsYWdzICYgSUZGX0RFQlVHKQorIAkJCXByaW50ZigiJXM6IHN0YXRp
b24gJXMgc2VudCBwc3BvbGwsIGJ1dCBubyBwYWNrZXRzIGFyZSBzYXZlZFxuIiwKKyAJCQkgICAg
ICAgaWZwLT5pZl94bmFtZSwgZXRoZXJfc3ByaW50Zih3aC0+aV9hZGRyMikpOworIAkJcmV0dXJu
OworIAl9CisgCXdoID0gbXRvZChtLCBzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopOworIAorIAkv
KiAKKyAJICogSWYgdGhpcyBpcyB0aGUgbGFzdCBwYWNrZXQsIHR1cm4gb2ZmIHRoZSBUSU0gZmll
bGRzLgorIAkgKiBJZiB0aGVyZSBhcmUgbW9yZSBwYWNrZXRzLCBzZXQgdGhlIG1vcmUgcGFja2V0
cyBiaXQuCisgCSAqLworIAorIAlpZiAoSUZfSVNfRU1QVFkoJm5pLT5uaV9zYXZlZHEpKSB7Cisg
CQlpZiAoaWMtPmljX3NldF90aW0pIAorIAkJCWljLT5pY19zZXRfdGltKGljLCBuaS0+bmlfYXNz
b2NpZCwgMCk7CisgCX0gZWxzZSB7CisgCQl3aC0+aV9mY1sxXSB8PSBJRUVFODAyMTFfRkMxX01P
UkVfREFUQTsKKyAJfQorIAorIAlpZiAoaWZwLT5pZl9mbGFncyAmIElGRl9ERUJVRykKKyAJCXBy
aW50ZigiJXM6IGVucXVldWVkIHBvd2VyIHNhdmluZyBwYWNrZXQgZm9yIHN0YXRpb24gJXNcbiIs
CisgCQkgICAgICAgaWZwLT5pZl94bmFtZSwgZXRoZXJfc3ByaW50ZihuaS0+bmlfbWFjYWRkcikp
OworIAorIAlJRl9FTlFVRVVFKCZpYy0+aWNfcHdyc2F2ZXEsIG0pOworIAkoKmlmcC0+aWZfc3Rh
cnQpKGlmcCk7CisgfQorIAorIAogIGludAogIGllZWU4MDIxMV9uZXdfc3RhdGUoc3RydWN0IGlm
bmV0ICppZnAsIGVudW0gaWVlZTgwMjExX3N0YXRlIG5zdGF0ZSwgaW50IG1ndCkKICB7CioqKioq
KioqKioqKioqKgoqKiogMjI4MywyMjg4ICoqKioKLS0tIDI0NDUsMjQ1MSAtLS0tCiAgCQkJaWMt
PmljX3NjYW5fdGltZXIgPSAwOwogIAkJCWljLT5pY19tZ3RfdGltZXIgPSAwOwogIAkJCUlGX1BV
UkdFKCZpYy0+aWNfbWd0cSk7CisgCQkJSUZfUFVSR0UoJmljLT5pY19wd3JzYXZlcSk7CiAgCQkJ
aWYgKGljLT5pY193ZXBfY3R4ICE9IE5VTEwpIHsKICAJCQkJZnJlZShpYy0+aWNfd2VwX2N0eCwg
TV9ERVZCVUYpOwogIAkJCQlpYy0+aWNfd2VwX2N0eCA9IE5VTEw7CkluZGV4OiBkZXYvaWMvd2ku
Ywo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMvc3lzL2Rldi9pYy93aS5jLHYKcmV0
cmlldmluZyByZXZpc2lvbiAxLjExMgpkaWZmIC1jIC1yMS4xMTIgd2kuYwoqKiogZGV2L2ljL3dp
LmMJMjAwMy8wMi8yNSAwMTo1NzozNQkxLjExMgotLS0gZGV2L2ljL3dpLmMJMjAwMy8wMy8xOSAy
MToyMDo0NgoqKioqKioqKioqKioqKioKKioqIDg5LDk0ICoqKioKLS0tIDg5LDk1IC0tLS0KICAK
ICAjaW5jbHVkZSA8bmV0L2lmLmg+CiAgI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgorICNpbmNsdWRl
IDxuZXQvaWZfbGxjLmg+CiAgI2luY2x1ZGUgPG5ldC9pZl9tZWRpYS5oPgogICNpbmNsdWRlIDxu
ZXQvaWZfZXRoZXIuaD4KICAjaW5jbHVkZSA8bmV0L2lmX2llZWU4MDIxMS5oPgoqKioqKioqKioq
KioqKioKKioqIDEzNSwxNDAgKioqKgotLS0gMTM2LDE0MiAtLS0tCiAgc3RhdGljIGludCAgd2lf
d3JpdGVfcmlkKHN0cnVjdCB3aV9zb2Z0YyAqLCBpbnQsIHZvaWQgKiwgaW50KTsKICAKICBzdGF0
aWMgaW50ICB3aV9uZXdzdGF0ZSh2b2lkICosIGVudW0gaWVlZTgwMjExX3N0YXRlKTsKKyBzdGF0
aWMgaW50ICB3aV9zZXRfdGltKHN0cnVjdCBpZWVlODAyMTFjb20gKiwgaW50LCBpbnQpOwogIAog
IHN0YXRpYyBpbnQgIHdpX3NjYW5fYXAoc3RydWN0IHdpX3NvZnRjICopOwogIHN0YXRpYyB2b2lk
IHdpX3NjYW5fcmVzdWx0KHN0cnVjdCB3aV9zb2Z0YyAqLCBpbnQsIGludCk7CioqKioqKioqKioq
KioqKgoqKiogMjQ1LDI1MCAqKioqCi0tLSAyNDcsMjUzIC0tLS0KICAJaWMtPmljX2ZsYWdzID0g
SUVFRTgwMjExX0ZfSEFTUE1HVCB8IElFRUU4MDIxMV9GX0hBU0FIREVNTzsKICAJaWMtPmljX3N0
YXRlID0gSUVFRTgwMjExX1NfSU5JVDsKICAJaWMtPmljX25ld3N0YXRlID0gd2lfbmV3c3RhdGU7
CisgCWljLT5pY19zZXRfdGltID0gd2lfc2V0X3RpbTsKICAKICAJLyogRmluZCBhdmFpbGFibGUg
Y2hhbm5lbCAqLwogIAlidWZsZW4gPSBzaXplb2YodmFsKTsKKioqKioqKioqKioqKioqCioqKiA3
MzcsNzQ0ICoqKioKICAJbWVtc2V0KCZmcm1oZHIsIDAsIHNpemVvZihmcm1oZHIpKTsKICAJY3Vy
ID0gc2MtPnNjX3R4bmV4dDsKICAJZm9yICg7OykgewohIAkJSUZfUE9MTCgmaWMtPmljX21ndHEs
IG0wKTsKISAJCWlmIChtMCAhPSBOVUxMKSB7CiAgCQkJaWYgKHNjLT5zY190eGRbY3VyXS5kX2xl
biAhPSAwKSB7CiAgCQkJCWlmcC0+aWZfZmxhZ3MgfD0gSUZGX09BQ1RJVkU7CiAgCQkJCWJyZWFr
OwotLS0gNzQwLDc0NiAtLS0tCiAgCW1lbXNldCgmZnJtaGRyLCAwLCBzaXplb2YoZnJtaGRyKSk7
CiAgCWN1ciA9IHNjLT5zY190eG5leHQ7CiAgCWZvciAoOzspIHsKISAJCWlmICghSUZfSVNfRU1Q
VFkoJmljLT5pY19tZ3RxKSkgewogIAkJCWlmIChzYy0+c2NfdHhkW2N1cl0uZF9sZW4gIT0gMCkg
ewogIAkJCQlpZnAtPmlmX2ZsYWdzIHw9IElGRl9PQUNUSVZFOwogIAkJCQlicmVhazsKKioqKioq
KioqKioqKioqCioqKiA3NDgsNzUzICoqKioKLS0tIDc1MCw3ODAgLS0tLQogIAkJCSAgICAoY2Fk
ZHJfdCkmZnJtaGRyLndpX2VoZHIpOwogIAkJCWZybWhkci53aV9laGRyLmV0aGVyX3R5cGUgPSAw
OwogICAgICAgICAgICAgICAgICAgICAgICAgIHdoID0gbXRvZChtMCwgc3RydWN0IGllZWU4MDIx
MV9mcmFtZSAqKTsKKyAJCX0gZWxzZSBpZiAoIUlGX0lTX0VNUFRZKCZpYy0+aWNfcHdyc2F2ZXEp
KSB7CisgCQkJc3RydWN0IGxsYyAqbGxjOworIAorIAkJCS8qIAorIAkJCSAqIFNob3VsZCB0aGVz
ZSBwYWNrZXRzIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUKKyAJCQkgKiByZWd1bGFyIHBhY2tldHMg
b3IgYmVmb3JlPyAgU2luY2UgdGhleSBhcmUgYmVpbmcKKyAJCQkgKiBwcm9iZWQgZm9yLCB0aGV5
IGFyZSBwcm9iYWJseSBsZXNzIHRpbWUgY3JpdGljYWwKKyAJCQkgKiB0aGFuIG90aGVyIHBhY2tl
dHMsIGJ1dCwgb24gdGhlIG90aGVyIGhhbmQsCisgCQkJICogd2Ugd2FudCB0aGUgcG93ZXIgc2F2
aW5nIG5vZGVzIHRvIGdvIGJhY2sgdG8KKyAJCQkgKiBzbGVlcCBhcyBxdWlja2x5IGFzIHBvc3Np
YmxlIHRvIHNhdmUgcG93ZXIuLi4KKyAJCQkgKi8KKyAKKyAJCQlpZiAoaWMtPmljX3N0YXRlICE9
IElFRUU4MDIxMV9TX1JVTikKKyAJCQkJYnJlYWs7CisgCisgCQkJaWYgKHNjLT5zY190eGRbY3Vy
XS5kX2xlbiAhPSAwKSB7CisgCQkJCWlmcC0+aWZfZmxhZ3MgfD0gSUZGX09BQ1RJVkU7CisgCQkJ
CWJyZWFrOworIAkJCX0KKyAJCQlJRl9ERVFVRVVFKCZpYy0+aWNfcHdyc2F2ZXEsIG0wKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICB3aCA9IG10b2QobTAsIHN0cnVjdCBpZWVlODAyMTFfZnJh
bWUgKik7CisgCQkJbGxjID0gKHN0cnVjdCBsbGMgKikgKHdoICsgMSk7CisgCQkJbV9jb3B5ZGF0
YShtMCwgNCwgRVRIRVJfQUREUl9MRU4gKiAyLAorIAkJCSAgICAoY2FkZHJfdCkmZnJtaGRyLndp
X2VoZHIpOworIAkJCWZybWhkci53aV9laGRyLmV0aGVyX3R5cGUgPSBsbGMtPmxsY19zbmFwLmV0
aGVyX3R5cGU7CiAgCQl9IGVsc2UgewogIAkJCWlmIChpYy0+aWNfc3RhdGUgIT0gSUVFRTgwMjEx
X1NfUlVOKQogIAkJCQlicmVhazsKKioqKioqKioqKioqKioqCioqKiA3NTksNzY3ICoqKioKICAJ
CQkJYnJlYWs7CiAgCQkJfQogIAkJCUlGUV9ERVFVRVVFKCZpZnAtPmlmX3NuZCwgbTApOwotIAkJ
CWlmcC0+aWZfb3BhY2tldHMrKzsKICAJCQltX2NvcHlkYXRhKG0wLCAwLCBFVEhFUl9IRFJfTEVO
LCAKICAJCQkgICAgKGNhZGRyX3QpJmZybWhkci53aV9laGRyKTsKICAjaWYgTkJQRklMVEVSID4g
MAogIAkJCWlmIChpZnAtPmlmX2JwZikKICAJCQkJYnBmX210YXAoaWZwLT5pZl9icGYsIG0wKTsK
LS0tIDc4Niw3OTQgLS0tLQogIAkJCQlicmVhazsKICAJCQl9CiAgCQkJSUZRX0RFUVVFVUUoJmlm
cC0+aWZfc25kLCBtMCk7CiAgCQkJbV9jb3B5ZGF0YShtMCwgMCwgRVRIRVJfSERSX0xFTiwgCiAg
CQkJICAgIChjYWRkcl90KSZmcm1oZHIud2lfZWhkcik7CisgCQkJaWZwLT5pZl9vcGFja2V0cysr
OwogICNpZiBOQlBGSUxURVIgPiAwCiAgCQkJaWYgKGlmcC0+aWZfYnBmKQogIAkJCQlicGZfbXRh
cChpZnAtPmlmX2JwZiwgbTApOwoqKioqKioqKioqKioqKioKKioqIDc3Miw3OTAgKioqKgogIAkJ
CQljb250aW51ZTsKICAJCQl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2ggPSBtdG9kKG0w
LCBzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICopOwogIAkJCWlmIChpYy0+aWNfb3Btb2RlID09IElF
RUU4MDIxMV9NX0hPU1RBUCAmJgogIAkJCSAgICAhSUVFRTgwMjExX0lTX01VTFRJQ0FTVCh3aC0+
aV9hZGRyMSkgJiYKICAJCQkgICAgKHdoLT5pX2ZjWzBdICYgSUVFRTgwMjExX0ZDMF9UWVBFX01B
U0spID09CiEgCQkJICAgIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBICYmCiEgCQkJICAgICgobmkg
PSBpZWVlODAyMTFfZmluZF9ub2RlKGljLCB3aC0+aV9hZGRyMSkpID09CiEgCQkJICAgIE5VTEwg
fHwgbmktPm5pX2Fzc29jaWQgPT0gMCkpIHsKISAJCQkJbV9mcmVlbShtMCk7CiEgCQkJCWlmcC0+
aWZfb2Vycm9ycysrOwohIAkJCQljb250aW51ZTsKICAJCQl9Ci0gCQkJaWYgKGljLT5pY19mbGFn
cyAmIElFRUU4MDIxMV9GX1dFUE9OKQotIAkJCQl3aC0+aV9mY1sxXSB8PSBJRUVFODAyMTFfRkMx
X1dFUDsKLSAKICAJCX0KICAjaWYgTkJQRklMVEVSID4gMAogIAkJaWYgKGljLT5pY19yYXdicGYp
Ci0tLSA3OTksODIxIC0tLS0KICAJCQkJY29udGludWU7CiAgCQkJfQogICAgICAgICAgICAgICAg
ICAgICAgICAgIHdoID0gbXRvZChtMCwgc3RydWN0IGllZWU4MDIxMV9mcmFtZSAqKTsKKyAJCQlp
ZiAoaWMtPmljX2ZsYWdzICYgSUVFRTgwMjExX0ZfV0VQT04pCisgCQkJCXdoLT5pX2ZjWzFdIHw9
IElFRUU4MDIxMV9GQzFfV0VQOwogIAkJCWlmIChpYy0+aWNfb3Btb2RlID09IElFRUU4MDIxMV9N
X0hPU1RBUCAmJgogIAkJCSAgICAhSUVFRTgwMjExX0lTX01VTFRJQ0FTVCh3aC0+aV9hZGRyMSkg
JiYKICAJCQkgICAgKHdoLT5pX2ZjWzBdICYgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spID09CiEg
CQkJICAgIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBKSB7CiEgCQkJCW5pID0gaWVlZTgwMjExX2Zp
bmRfbm9kZShpYywgd2gtPmlfYWRkcjEpOwohIAkJCQlpZiAobmkgPT0gTlVMTCB8fCBuaS0+bmlf
YXNzb2NpZCA9PSAwKSB7CiEgCQkJCQltX2ZyZWVtKG0wKTsKISAJCQkJCWlmcC0+aWZfb2Vycm9y
cysrOwohIAkJCQkJY29udGludWU7CiEgCQkJCX0KISAJCQkJaWYgKG5pLT5uaV9wd3JzYXZlICYg
SUVFRTgwMjExX1BXUl9TTEVFUCkgewohIAkJCQkJaWVlZTgwMjExX3B3cnNhdmUoaWMsIG5pLCBt
MCk7CiEgCQkJCQljb250aW51ZTsKISAJCQkJfQogIAkJCX0KICAJCX0KICAjaWYgTkJQRklMVEVS
ID4gMAogIAkJaWYgKGljLT5pY19yYXdicGYpCioqKioqKioqKioqKioqKgoqKiogMjIzMiwyMjM3
ICoqKioKLS0tIDIyNjMsMjI4MCAtLS0tCiAgCiAgCS8qIHNraXAgc3RhbmRhcmQgaWVlZTgwMjEx
IGhhbmRsaW5nICovCiAgCXJldHVybiBFSU5QUk9HUkVTUzsKKyB9CisgCisgc3RhdGljIGludAor
IHdpX3NldF90aW0oc3RydWN0IGllZWU4MDIxMWNvbSAqaWMsIGludCBhaWQsIGludCB3aGljaCkK
KyB7CisgCXN0cnVjdCB3aV9zb2Z0YyAqc2MgPSBpYy0+aWNfc29mdGM7CisgCisgCWFpZCAmPSB+
MHhjMDAwOworIAlpZiAod2hpY2gpCisgCQlhaWQgfD0gMHg4MDAwOworIAorIAlyZXR1cm4gd2lf
d3JpdGVfdmFsKHNjLCBXSV9SSURfU0VUX1RJTSwgYWlkKTsKICB9CiAgCiAgc3RhdGljIGludApJ
bmRleDogZGV2L2ljL3dpX2llZWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3Zzcm9vdC9zcmMv
c3lzL2Rldi9pYy93aV9pZWVlLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTkKZGlmZiAtYyAt
cjEuMTkgd2lfaWVlZS5oCioqKiBkZXYvaWMvd2lfaWVlZS5oCTIwMDIvMTEvMTYgMDY6MDI6NTQJ
MS4xOQotLS0gZGV2L2ljL3dpX2llZWUuaAkyMDAzLzAzLzE5IDIxOjIwOjQ3CioqKioqKioqKioq
KioqKgoqKiogMjM3LDI0MiAqKioqCi0tLSAyMzcsMjQzIC0tLS0KICAjZGVmaW5lIFdJX1JJRF9D
TkZBVVRITU9ERQkweEZDMkEKICAjZGVmaW5lIFdJX1JJRF9ST0FNSU5HX01PREUJMHhGQzJECiAg
I2RlZmluZSBXSV9SSURfT1dOX0JFQUNPTl9JTlQJMHhGQzMzIC8qIGJlYWNvbiB4bWl0IHRpbWUg
Zm9yIEJTUyBjcmVhdGlvbiAqLworICNkZWZpbmUgV0lfUklEX1NFVF9USU0JCTB4RkM0MAogICNk
ZWZpbmUgV0lfUklEX0RCTV9BREpVU1QJMHhGQzQ2IC8qIFJTU0kgLSBXSV9SSURfREJNX0FESlVT
VCB+IGRCbSAqLwogICNkZWZpbmUgV0lfUklEX0JBU0lDX1JBVEUJMHhGQ0IzCiAgI2RlZmluZSBX
SV9SSURfU1VQUE9SVF9SQVRFCTB4RkNCNAo=

--Multipart_Wed__19_Mar_2003_16:19:29_-0800_08161400--
--
*bsd wireless list, a bawug thing <http://www.bawug.org/>
[un]subscribe: http://lists.bawug.org/mailman/listinfo/bsd-wireless/