1 /** @file wlan_features.c
2 *
3 * @brief This file provides WLAN Features API
4 *
5 * Copyright 2021-2024 NXP
6 *
7 * SPDX-License-Identifier: BSD-3-Clause
8 *
9 */
10
11 #include <wlan.h>
12 #include <cli_utils.h>
13 #include <string.h>
14 #include <wm_net.h> /* for net_inet_aton */
15 #include <wifi.h>
16
17 #if CONFIG_WIFI_FEATURES
18
19 #ifdef ENABLE_OFFLOAD
test_wlan_ns_offload(int argc,char ** argv)20 static void test_wlan_ns_offload(int argc, char **argv)
21 {
22 int ret = -WM_FAIL;
23 ret = wlan_set_ipv6_ns_offload();
24 if (ret == WM_SUCCESS)
25 {
26 (void)PRINTF("Enabled wlan IPv6 NS offload feature");
27 }
28 else
29 {
30 (void)PRINTF("Failed to enabled wlan auto arp offload, error: %d", ret);
31 }
32 }
33
test_wlan_auto_arp(int argc,char ** argv)34 static void test_wlan_auto_arp(int argc, char **argv)
35 {
36 int ret = -WM_FAIL;
37 ret = wlan_set_auto_arp();
38 if (ret == WM_SUCCESS)
39 (void)PRINTF("Enabled wlan auto arp offload feature\r\n");
40 else
41 (void)PRINTF("Failed to enabled wlan auto arp offload, error: %d\r\n", ret);
42 }
dump_wlan_add_packet_filter()43 static void dump_wlan_add_packet_filter()
44 {
45 (void)PRINTF("Usage:\r\n");
46 (void)PRINTF("For wowlan Add packet filter\r\n");
47 (void)PRINTF("wowlan magic filter:\r\n");
48 (void)PRINTF("wlan_add_packet_filter 1:\r\n");
49 (void)PRINTF("wowlan User defined pattren packet filter:\r\n");
50 (void)PRINTF("wlan_add_packet_filter 0 <number of patterns> <ptn_len> <pkt_offset> <ptn> ........:\r\n");
51 (void)PRINTF(
52 "For 2 number of patterns Usage \r\nwlan_add_packet_filter 0 2 6 0 0xff 0xff 0xff 0xff 0xff 0xff 4 20 192 168 "
53 "10 1\r\n");
54 (void)PRINTF("wowlan User defined pattren and magic packet filter:\r\n");
55 (void)PRINTF("wlan_add_packet_filter 1 <number of patterns> <ptn_len> <pkt_offset> <ptn> ........:\r\n");
56 (void)PRINTF(
57 "For 2 number of patterns Usage \r\nwlan_add_packet_filter 1 2 6 0 0xff 0xff 0xff 0xff 0xff 0xff 4 20 192 168 "
58 "10 1\r\n");
59 }
test_wlan_add_packet_filter(int argc,char ** argv)60 static void test_wlan_add_packet_filter(int argc, char **argv)
61 {
62 int ret = -WM_FAIL;
63 t_u8 i = 0, j = 0, k = 0;
64 wlan_wowlan_ptn_cfg_t wowlan_ptn_cfg;
65 if (argc < 2)
66 {
67 (void)PRINTF("Usage: %s <0/1>\r\n", argv[0]);
68 (void)PRINTF("Error: Specify 1 to magic filter\r\n");
69 dump_wlan_add_packet_filter();
70 return;
71 }
72 if (argc > 3 && atoi(argv[2]) != argc - 3)
73 {
74 (void)PRINTF("Usage: %s 0/1 <patterns number> <ptn_len> <pkt_offset> <ptn> ...........\r\n", argv[0]);
75 dump_wlan_add_packet_filter();
76 return;
77 }
78 (void)memset(&wowlan_ptn_cfg, 0, sizeof(wlan_wowlan_ptn_cfg_t));
79 wowlan_ptn_cfg.enable = atoi(argv[1]);
80 if (argc > 2)
81 {
82 wowlan_ptn_cfg.n_patterns = atoi(argv[2]);
83 for (i = 0, k = 0; (i + 3 < argc) && k < MAX_NUM_FILTERS; k++)
84 {
85 wowlan_ptn_cfg.patterns[k].pattern_len = atoi(argv[i + 3]);
86 i++;
87 wowlan_ptn_cfg.patterns[k].pkt_offset = atoi(argv[i + 3]);
88 i++;
89 for (j = 0; j < wowlan_ptn_cfg.patterns[k].pattern_len; j++)
90 wowlan_ptn_cfg.patterns[k].pattern[j] = atoi(argv[j + i + 3]);
91 i = +j;
92 (void)memset(wowlan_ptn_cfg.patterns[k].mask, 0x3f, 6);
93 }
94 }
95 ret = wlan_wowlan_cfg_ptn_match(&wowlan_ptn_cfg);
96 if (ret == WM_SUCCESS)
97 (void)PRINTF("Enabled pkt filter offload feature");
98 else
99 (void)PRINTF("Failed to enabled magic pkt filter offload, error: %d", ret);
100 }
101 #endif
102
103 static struct cli_command features[] = {
104 {"enable-ns-offload", NULL, test_wlan_ns_offload},
105 {"wlan-auto-arp", NULL, test_wlan_auto_arp},
106 {"wlan-add-packet-filter", "0/1 <patterns number> <ptn_len> <pkt_offset> <ptn> ...........",
107 test_wlan_add_packet_filter},
108 };
109
110 /* Register our commands with the MTF. */
wlan_features_cli_init(void)111 int wlan_features_cli_init(void)
112 {
113 int i;
114
115 for (i = 0; i < sizeof(features) / sizeof(struct cli_command); i++)
116 {
117 if (cli_register_command(&features[i]) != 0)
118 {
119 return WLAN_ERROR_ACTION;
120 }
121 }
122
123 return WLAN_ERROR_NONE;
124 }
125
wlan_features_cli_deinit(void)126 int wlan_features_cli_deinit(void)
127 {
128 int i;
129
130 for (i = 0; i < sizeof(features) / sizeof(struct cli_command); i++)
131 {
132 if (cli_unregister_command(&features[i]) != 0)
133 {
134 return WLAN_ERROR_ACTION;
135 }
136 }
137
138 return WLAN_ERROR_NONE;
139 }
140 #endif
141