MBO-STA: Initiate GAS ANQP query frame with sta_send_frame

Initiate GAS ANQP query to get either neighbor report or MBO cellular
data connection preference whe sta_send_frame is used with program,MBO
and FrameName,ANQPQuery.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
diff --git a/sta.c b/sta.c
index e4ea598..4be4a05 100644
--- a/sta.c
+++ b/sta.c
@@ -6543,6 +6543,62 @@
 }
 
 
+static int mbo_send_anqp_query(struct sigma_dut *dut, struct sigma_conn *conn,
+			       const char *intf, struct sigma_cmd *cmd)
+{
+	const char *val, *addr;
+	char buf[100];
+
+	addr = get_param(cmd, "DestMac");
+	if (!addr) {
+		send_resp(dut, conn, SIGMA_INVALID,
+			  "ErrorCode,AP MAC address is missing");
+		return 0;
+	}
+
+	val = get_param(cmd, "ANQPQuery_ID");
+	if (!val) {
+		send_resp(dut, conn, SIGMA_INVALID,
+			  "ErrorCode,Missing ANQPQuery_ID");
+		return 0;
+	}
+
+	if (strcasecmp(val, "NeighborReportReq") == 0) {
+		snprintf(buf, sizeof(buf), "ANQP_GET %s 272", addr);
+	} else if (strcasecmp(val, "QueryListWithCellPref") == 0) {
+		snprintf(buf, sizeof(buf), "ANQP_GET %s 272,mbo:2", addr);
+	} else {
+		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid ANQPQuery_ID: %s",
+				val);
+		send_resp(dut, conn, SIGMA_INVALID,
+			  "ErrorCode,Invalid ANQPQuery_ID");
+		return 0;
+	}
+
+	if (wpa_command(intf, buf) < 0) {
+		send_resp(dut, conn, SIGMA_ERROR,
+			  "ErrorCode,Failed to send ANQP query");
+		return 0;
+	}
+
+	return 1;
+}
+
+
+static int mbo_cmd_sta_send_frame(struct sigma_dut *dut,
+				  struct sigma_conn *conn,
+				  const char *intf,
+				  struct sigma_cmd *cmd)
+{
+	const char *val = get_param(cmd, "FrameName");
+
+	if (val && strcasecmp(val, "ANQPQuery") == 0)
+		return mbo_send_anqp_query(dut, conn, intf, cmd);
+
+	return 2;
+}
+
+
 int cmd_sta_send_frame(struct sigma_dut *dut, struct sigma_conn *conn,
 		       struct sigma_cmd *cmd)
 {
@@ -6568,6 +6624,11 @@
 		return loc_cmd_sta_send_frame(dut, conn, cmd);
 	if (val && strcasecmp(val, "60GHz") == 0)
 		return cmd_sta_send_frame_60g(dut, conn, cmd);
+	if (val && strcasecmp(val, "MBO") == 0) {
+		res = mbo_cmd_sta_send_frame(dut, conn, intf, cmd);
+		if (res != 2)
+			return res;
+	}
 
 	val = get_param(cmd, "TD_DISC");
 	if (val) {