LCOV - code coverage report
Current view: top level - zephyr/net - wifi_credentials.h Hit Total Coverage
Test: new.info Lines: 30 38 78.9 %
Date: 2024-12-21 18:13:37

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2024 Nordic Semiconductor ASA
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef WIFI_CREDENTIALS_H__
       8             : #define WIFI_CREDENTIALS_H__
       9             : 
      10             : #include <zephyr/types.h>
      11             : #include <zephyr/net/wifi.h>
      12             : #include <zephyr/kernel.h>
      13             : 
      14             : /**
      15             :  * @defgroup wifi_credentials Wi-Fi credentials library
      16             :  * @ingroup networking
      17             :  * @since 4.0
      18             :  * @version 0.1.0
      19             :  * @{
      20             :  * @brief Library that provides a way to store and load Wi-Fi credentials.
      21             :  */
      22             : 
      23             : #ifdef __cplusplus
      24             : extern "C" {
      25             : #endif
      26             : 
      27             : /* this entry contains a BSSID */
      28           0 : #define WIFI_CREDENTIALS_FLAG_BSSID        BIT(0)
      29             : /* this entry is to be preferred over others */
      30           0 : #define WIFI_CREDENTIALS_FLAG_FAVORITE     BIT(1)
      31             : /* this entry can use the 2.4 GHz band */
      32           0 : #define WIFI_CREDENTIALS_FLAG_2_4GHz       BIT(2)
      33             : /* this entry can use the 5 GHz band */
      34           0 : #define WIFI_CREDENTIALS_FLAG_5GHz         BIT(3)
      35             : /* this entry requires management frame protection */
      36           0 : #define WIFI_CREDENTIALS_FLAG_MFP_REQUIRED BIT(4)
      37             : /* this entry disables management frame protection */
      38           0 : #define WIFI_CREDENTIALS_FLAG_MFP_DISABLED BIT(5)
      39             : 
      40           0 : #define WIFI_CREDENTIALS_MAX_PASSWORD_LEN                                                          \
      41             :         MAX(WIFI_PSK_MAX_LEN, CONFIG_WIFI_CREDENTIALS_SAE_PASSWORD_LENGTH)
      42             : 
      43             : /**
      44             :  * @brief Wi-Fi credentials entry header
      45             :  * @note Every settings entry starts with this header.
      46             :  *       Depending on the `type` field, the header can be casted to a larger type.
      47             :  *       In addition to SSID (usually a string) and BSSID (a MAC address),
      48             :  *       a `flags` field can be used to control some detail settings.
      49             :  *
      50             :  */
      51           1 : struct wifi_credentials_header {
      52           1 :         enum wifi_security_type type;     /**< Wi-Fi security type */
      53           1 :         char ssid[WIFI_SSID_MAX_LEN];     /**< SSID (Service Set Identifier) */
      54           1 :         size_t ssid_len;                  /**< Length of the SSID */
      55           1 :         uint32_t flags;                   /**< Flags for controlling detail settings */
      56           1 :         uint32_t timeout;                 /**< Timeout for connecting to the network */
      57           1 :         uint8_t bssid[WIFI_MAC_ADDR_LEN]; /**< BSSID (Basic Service Set Identifier) */
      58           1 :         uint8_t channel;                  /**< Channel on which the network operates */
      59             : };
      60             : 
      61             : /**
      62             :  * @brief Wi-Fi Personal credentials entry
      63             :  * @note Contains only the header and a password.
      64             :  *       For PSK security, passwords can be up to `WIFI_PSK_MAX_LEN` bytes long
      65             :  *       including NULL termination. For SAE security it can range up to
      66             :  *       `CONFIG_WIFI_CREDENTIALS_SAE_PASSWORD_LENGTH`.
      67             :  *
      68             :  */
      69           1 : struct wifi_credentials_personal {
      70           1 :         struct wifi_credentials_header header;            /**< Header */
      71           1 :         char password[WIFI_CREDENTIALS_MAX_PASSWORD_LEN]; /**< Password/PSK */
      72           1 :         size_t password_len;                              /**< Length of the password */
      73             : };
      74             : 
      75             : /**
      76             :  * @brief Wi-Fi Enterprise credentials entry
      77             :  * @note This functionality is not yet implemented.
      78             :  */
      79           1 : struct wifi_credentials_enterprise {
      80           1 :         struct wifi_credentials_header header; /**< Header */
      81           1 :         size_t identity_len;                   /**< Length of the identity */
      82           1 :         size_t anonymous_identity_len;         /**< Length of the anonymous identity */
      83           1 :         size_t password_len;                   /**< Length of the password */
      84           1 :         size_t ca_cert_len;                    /**< Length of the CA certificate */
      85           1 :         size_t client_cert_len;                /**< Length of the client certificate */
      86           1 :         size_t private_key_len;                /**< Length of the private key */
      87           1 :         size_t private_key_pw_len;             /**< Length of the private key password */
      88             : };
      89             : 
      90             : /**
      91             :  * @brief Get credentials for given SSID.
      92             :  *
      93             :  * @param[in] ssid                      SSID to look for
      94             :  * @param[in] ssid_len                  length of SSID
      95             :  * @param[out] type                     Wi-Fi security type
      96             :  * @param[out] bssid_buf                buffer to store BSSID if it was fixed
      97             :  * @param[in] bssid_buf_len             length of bssid_buf
      98             :  * @param[out] password_buf             buffer to store password
      99             :  * @param[in] password_buf_len          length of password_buf
     100             :  * @param[out] password_len             length of password
     101             :  * @param[out] flags                    flags
     102             :  * @param[out] channel                  channel
     103             :  * @param[out] timeout                  timeout
     104             :  *
     105             :  * @return 0            Success.
     106             :  * @return -ENOENT      No network with this SSID was found.
     107             :  * @return -EINVAL      A required buffer was NULL or invalid SSID length.
     108             :  * @return -EPROTO      The network with this SSID is not a personal network.
     109             :  */
     110           1 : int wifi_credentials_get_by_ssid_personal(const char *ssid, size_t ssid_len,
     111             :                                           enum wifi_security_type *type, uint8_t *bssid_buf,
     112             :                                           size_t bssid_buf_len, char *password_buf,
     113             :                                           size_t password_buf_len, size_t *password_len,
     114             :                                           uint32_t *flags, uint8_t *channel, uint32_t *timeout);
     115             : 
     116             : /**
     117             :  * @brief Set credentials for given SSID.
     118             :  *
     119             :  * @param[in] ssid              SSID to look for
     120             :  * @param[in] ssid_len          length of SSID
     121             :  * @param[in] type              Wi-Fi security type
     122             :  * @param[in] bssid             BSSID (may be NULL)
     123             :  * @param[in] bssid_len         length of BSSID buffer (either 0 or WIFI_MAC_ADDR_LEN)
     124             :  * @param[in] password          password
     125             :  * @param[in] password_len              length of password
     126             :  * @param[in] flags                     flags
     127             :  * @param[in] channel                   Channel
     128             :  * @param[in] timeout                   Timeout
     129             :  *
     130             :  * @return 0                    Success. Credentials are stored in persistent storage.
     131             :  * @return -EINVAL              A required buffer was NULL or security type is not supported.
     132             :  * @return -ENOTSUP             Security type is not supported.
     133             :  * @return -ENOBUFS             All slots are already taken.
     134             :  */
     135           1 : int wifi_credentials_set_personal(const char *ssid, size_t ssid_len, enum wifi_security_type type,
     136             :                                   const uint8_t *bssid, size_t bssid_len, const char *password,
     137             :                                   size_t password_len, uint32_t flags, uint8_t channel,
     138             :                                   uint32_t timeout);
     139             : 
     140             : /**
     141             :  * @brief Get credentials for given SSID by struct.
     142             :  *
     143             :  * @param[in] ssid              SSID to look for
     144             :  * @param[in] ssid_len          length of SSID
     145             :  * @param[out] buf              credentials Pointer to struct where credentials are stored
     146             :  *
     147             :  * @return 0                    Success.
     148             :  * @return -ENOENT              No network with this SSID was found.
     149             :  * @return -EINVAL              A required buffer was NULL or too small.
     150             :  * @return -EPROTO              The network with this SSID is not a personal network.
     151             :  */
     152           1 : int wifi_credentials_get_by_ssid_personal_struct(const char *ssid, size_t ssid_len,
     153             :                                                  struct wifi_credentials_personal *buf);
     154             : 
     155             : /**
     156             :  * @brief Set credentials for given SSID by struct.
     157             :  *
     158             :  * @param[in] creds             credentials Pointer to struct from which credentials are loaded
     159             :  *
     160             :  * @return 0                    Success.
     161             :  * @return -ENOENT              No network with this SSID was found.
     162             :  * @return -EINVAL              A required buffer was NULL or incorrect size.
     163             :  * @return -ENOBUFS             All slots are already taken.
     164             :  */
     165           1 : int wifi_credentials_set_personal_struct(const struct wifi_credentials_personal *creds);
     166             : 
     167             : /**
     168             :  * @brief Delete credentials for given SSID.
     169             :  *
     170             :  * @param[in] ssid              SSID to look for
     171             :  * @param[in] ssid_len          length of SSID
     172             :  *
     173             :  * @return                      -ENOENT if No network with this SSID was found.
     174             :  * @return                      0 on success, otherwise a negative error code
     175             :  */
     176           1 : int wifi_credentials_delete_by_ssid(const char *ssid, size_t ssid_len);
     177             : 
     178             : /**
     179             :  * @brief Check if credentials storage is empty.
     180             :  *
     181             :  * @return                      true if credential storage is empty, otherwise false
     182             :  */
     183           1 : bool wifi_credentials_is_empty(void);
     184             : 
     185             : /**
     186             :  * @brief Deletes all stored Wi-Fi credentials.
     187             :  *
     188             :  * This function deletes all Wi-Fi credentials that have been stored in the system.
     189             :  * It is typically used when you want to clear all saved networks.
     190             :  *
     191             :  * @return                      0 on successful, otherwise a negative error code
     192             :  */
     193           1 : int wifi_credentials_delete_all(void);
     194             : 
     195             : /**
     196             :  * @brief Callback type for wifi_credentials_for_each_ssid.
     197             :  * @param[in] cb_arg      arguments for the callback function. Appropriate cb_arg is
     198             :  *                        transferred by wifi_credentials_for_each_ssid.
     199             :  * @param[in] ssid        SSID
     200             :  * @param[in] ssid_len    length of SSID
     201             :  */
     202           1 : typedef void (*wifi_credentials_ssid_cb)(void *cb_arg, const char *ssid, size_t ssid_len);
     203             : 
     204             : /**
     205             :  * @brief Call callback for each registered SSID.
     206             :  *
     207             :  * @param cb            callback
     208             :  * @param cb_arg        argument for callback function
     209             :  */
     210           1 : void wifi_credentials_for_each_ssid(wifi_credentials_ssid_cb cb, void *cb_arg);
     211             : 
     212             : #ifdef __cplusplus
     213             : }
     214             : #endif
     215             : 
     216             : /** @} */
     217             : 
     218             : #endif /* WIFI_CREDENTIALS_H__ */

Generated by: LCOV version 1.14