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