public static void LinkActionCallback(Object stateInfo) { Message m = (Message)stateInfo; ConnectionHelper ch = Program.toMihf; ushort transactionID = m.MIHHeader.TransactionID; Payload.TLVIterator it = m.Payload.GetTLVIterator(); ID srcID = new ID(new OctetString(it.Next().Value)); ID dstID = new ID(new OctetString(it.Next().Value)); Link_Action_Request lar = new Link_Action_Request(MIHDeserializer.DeserializeLinkAction(it.Next()), MIHDeserializer.DeserializeTimeInterval(it.Next()), MIHDeserializer.DeserializePoA(it.Next())); Link_Action_Response laresp = new Link_Action_Response(); laresp.Status = STATUS.UNSPECIFIED_FAILURE; laresp.Result = Link_Ac_Result.INCAPABLE; NativeWifi.WlanClient.WlanInterface iface = null; try { iface = Information.GenericInfo.WlanInterfaceInstance; } catch (Exception e) { /*nothing*/ } switch (lar.LinkAction.LinkAcType) { case Link_Ac_Type.LINK_DISCONNECT: ActionsInterface.Action_Disconnect(ref laresp, ref iface); break; case Link_Ac_Type.NONE: Console.WriteLine("No action performed."); laresp.Status = STATUS.SUCCESS; laresp.Result = Link_Ac_Result.SUCCESS; break; case Link_Ac_Type.LINK_POWER_DOWN: ActionsInterface.Action_Power_Down(ref laresp, ref iface); break; case Link_Ac_Type.LINK_POWER_UP: ActionsInterface.Action_Power_Up(ref laresp, ref iface); break; default: throw new InvalidOperationException("Unsupported Operation"); } laresp.ScanResults = new List <Link_Scan_Rsp>(); if (lar.LinkAction.LinkAcAttr.Link_Scan) { ActionsInterface.Action_Scan(laresp, iface, m);//Message is sent inside this branch, after the scan is complete. } else { ch.Send(ResponseBuilders.Link_Action_Response_Builder(srcID, dstID, transactionID, laresp).ByteValue); } }
/// <summary> /// To be called when a requested scan was complete. This method sends all pending Link_Action_Responses that were waiting for a scan result. /// </summary> public static void FinishScanAction() { List <Link_Scan_Rsp> scanResults = new List <Link_Scan_Rsp>(); foreach (NativeWifi.Wlan.WlanBssEntry entry in Information.GenericInfo.WlanInterfaceInstance.Connections) { PhysicalAddress pa = new PhysicalAddress(entry.dot11Bssid); scanResults.Add(new Link_Scan_Rsp(new Link_Addr(Link_Addr.Address_Type.MAC_ADDR, Utilities.PhysicalAddressToString(pa)), new OctetString(new String(Encoding.ASCII.GetChars(entry.dot11Ssid.SSID))), (ushort)entry.linkQuality)); } foreach (Message m in Information.MiscData.PendingLinkActionResponses.Keys) { Link_Action_Response laresp; Information.MiscData.PendingLinkActionResponses.TryGetValue(m, out laresp); laresp.ScanResults = scanResults; Payload.TLVIterator it = m.Payload.GetTLVIterator(); ID srcID = new ID(new OctetString(it.Next().Value)); ID dstID = new ID(new OctetString(it.Next().Value)); Program.toMihf.Send(ResponseBuilders.Link_Action_Response_Builder(srcID, dstID, m.MIHHeader.TransactionID, laresp).ByteValue); } Information.MiscData.PendingLinkActionResponses.Clear(); }