Files
m241Neelima/components/ip_net2-6.9/ipmacsec/include/ipmacsec_netlink.h
T
2026-07-30 11:19:44 +05:30

601 lines
27 KiB
C

/* ipmacsec_netlink.h - IPMACSEC Netlink header file */
/*
* Copyright (c) 2010 Wind River Systems, Inc.
*
* The right to copy, distribute, modify, or otherwise make use
* of this software may be licensed only pursuant to the terms
* of an applicable Wind River license agreement.
*
*/
/*
modification history
--------------------
01a,17mar10,mry Created
*/
#ifndef IPMACSEC_NETLINK_H
#define IPMACSEC_NETLINK_H
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/* This header file is to be included by internal or external modules
* that use Netlink to interface to the MACsec SecY management entity
* (for control, configuration, notification, status/statistics retrieval)
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#include <ipcom_type.h>
#include <ipcom_cstyle.h>
#ifdef IP_PORT_VXWORKS
#include <vsbConfig.h>
#endif
#include <ipcom_netlink.h>
#include <ipcom_sock.h>
#include "ipmacsec_lmi.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
/* Buffer size for MACsec netlink messages */
#define IPMACSEC_NETLINK_BUFSIZ (16*1024)
/* MACsec Netlink type validation macro */
#define IPMACSEC_NLTYPE_IS_VALID(nltype) (((nltype) >= __IPMACSEC_NLTYPE_BASE) && ((nltype) < __IPMACSEC_NLTYPE_MAX))
/* MACsec Netlink Command and Notification messages macros */
#define IPMACSEC_NLCMD_LENGTH(len) (IP_NLMSG_LENGTH(sizeof(Ipmacsec_nlcmd_hdr)+(len)))
#define IPMACSEC_NLCMD_DATA(nlmsg) ((void*)(((Ip_u8 *)nlmsg) + IPMACSEC_NLCMD_LENGTH(0)))
#define IPMACSEC_NLNOTE_LENGTH(len) (IP_NLMSG_LENGTH(sizeof(Ipmacsec_nlnote_hdr)+(len)))
#define IPMACSEC_NLNOTE_DATA(nlmsg) ((void*)(((Ip_u8 *)nlmsg) + IPMACSEC_NLNOTE_LENGTH(0)))
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
/* IPMACSEC netlink multicast groups */
typedef enum {
IPMACSEC_NLGRP_NONE = 0,
IPMACSEC_NLGRP_RESERVED, /* RESERVED for netlink management. NOT USED BY APPLICATIONS */
IPMACSEC_NLGRP_NOTIFY, /* Notification Group */
IPMACSEC_NLGRP_MONITOR, /* Monitor Group; Mainly used for debugging to monitor SecY events */
/* Do not insert anything below this */
__IPMACSEC_NLGRP_MAX
} Ip_macsec_netlink_groups;
/* IPMACSEC NETLINK TYPE DEFINITIONS */
typedef enum {
__IPMACSEC_NLTYPE_BASE = 16,
IPMACSEC_NLTYPE_TEST = __IPMACSEC_NLTYPE_BASE, /* For debugging purposes only (produces no action other than an ACK)
* Does not contain anything besides the netlink message header
*/
/*
* Notification messages of the following types always contain an Ipmacsec_nlnote_hdr
* after the netlink message header, in addition to any applicable parameters that follow.
*/
IPMACSEC_NLTYPE_NOTIFY, /* Notification events */
/*
* Command messages of the following types always contain an Ipmacsec_nlcmd_hdr
* after the netlink message header, in addition to any applicable parameters that follow.
*/
IPMACSEC_NLTYPE_SECY_COMMAND, /* SECY commands. */
IPMACSEC_NLTYPE_CP_COMMAND, /* Controlled Port commands. */
IPMACSEC_NLTYPE_UCP_COMMAND, /* Uncontrolled Port commands. */
IPMACSEC_NLTYPE_SIG_EXIT, /* Netlink socket exit signal. FOR INTERNAL USE ONLY, not used directly by applications */
/* Do not insert anything below this. MUST not exceed the maximum size of nlmsg_type in Ip_nlmsghdr */
__IPMACSEC_NLTYPE_MAX
} Ipmacsec_netlink_type;
/* Header for all IPMACsec netlink messages containing a command (follows the netlink message header) */
typedef struct Ipmacsec_nlcmd_hdr_struct {
char ifname[IP_IFNAMSIZ]; /* Interface name for the corresponding command */
Ipmacsec_lmi_command command; /* interpreted by the appropriate handler */
Ip_bool get; /* TRUE for a get command, FALSE for a set command
* Get commands have no request params,
* Set commands have no reply params
*/
Ip_bool reply; /* TRUE for a reply (get commands only), FALSE for a request */
Ip_u16 param_len; /* Command parameter(s) length */
Ip_u16 param_off; /* Offset of next available parameter (used when removing params) */
} Ipmacsec_nlcmd_hdr;
/* Header for all IPMACsec netlink messages containing a notification (follows the netlink message header) */
typedef struct Ipmacsec_nlnote_hdr_struct {
char ifname[IP_IFNAMSIZ]; /* Interface name for the corresponding command */
Ipmacsec_lmi_note note; /* interpreted by the appropriate handler */
Ip_u16 param_len; /* Notification parameter(s) length */
Ip_u16 param_off; /* Offset of next available parameter (used when removing params) */
} Ipmacsec_nlnote_hdr;
/* IPMACSEC netlink callback function signature */
typedef int (* IPMACSEC_NL_CB)(struct Ip_nlmsghdr *nlmsg, int error);
/* IPMACSEC NETLINK HANDLE Structure:
* =================================
* Note that the members of this structure MUST not be manipulated directly by
* applications. Instead the ipmacsec_netlink_open() and ipmacsec_netlink_register()
* APIs should be used.
*/
typedef struct Ipmacsec_netlink_handle_struct
{
Ip_fd nlsock;
struct Ip_sockaddr_nl local_nladdr;
Ip_u32 sequence;
char nlbuf[IPMACSEC_NETLINK_BUFSIZ];
IPMACSEC_NL_CB callback;
struct Ip_timeval nl_tmo;
Ip_bool exit_loop_on_error;
Ip_u32 dest_pid; /* RESERVED for MACsec Netlink operation. Not to be modified by applications. */
Ip_u32 dest_groups; /* RESERVED for MACsec Netlink operation. Not to be modified by applications. */
} Ipmacsec_netlink_handle;
/*
****************************************************************************
* 6 GLOBAL FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipmacsec_netlink_open
*===========================================================================
* Description: Allocates a MACsec netlink handles and opens and binds the
netlink socket so you can send requests and receive responses.
* Must call ipmacsec_netlink_register() if you want to receive notifications.
* Parameters: groups - The netlink groups for this socket.
* Returns: A handle pointer that can be passed to ipmacsec_netlink_register(),
* ipmacsec_netlink_send_request() or ipmacsec_netlink_loop().
* IP_NULL is returned upon error
*/
IP_GLOBAL Ipmacsec_netlink_handle *
ipmacsec_netlink_open(Ip_macsec_netlink_groups groups);
/*
*===========================================================================
* ipmacsec_netlink_close
*===========================================================================
* Description: Closes a MACsec netlink socket and frees the handle
* Parameters: nlhandle - Pointer to a MACsec netlink handle
* Returns: 0 upon success.
*
*/
IP_GLOBAL int
ipmacsec_netlink_close(Ipmacsec_netlink_handle *nlhandle);
/*
*===========================================================================
* ipmacsec_netlink_request
*===========================================================================
* Description: Sends a MACsec netlink request and pends for response
* Parameters: nlhandle - netlink handle allocated with ipmacsec_netlink_open()
* request - A non NULL netlink request buffer starting with
* an Ip_nlmsghdr and optionally containing additional
* netlink message(s)
* response - If NULL, the caller does not care for the response and
* will only process the return code.
* If not NULL, it must point to a proper Ipmacsec_buffer
* with enough buffer space to receive the response
* (if there is not enough space, the response is truncated)
* "response" contents are only valid if the return code is 0.
* Returns: 0 if successful in sending and receives a positive ACK
* < 0 if it fails, times out waiting for ACK, or receives a negative ACK
*
*/
IP_GLOBAL int
ipmacsec_netlink_request(Ipmacsec_netlink_handle *nlhandle,
struct Ip_nlmsghdr *request,
Ipmacsec_buffer *response);
/*
*===========================================================================
* ipmacsec_netlink_register
*===========================================================================
* Description: Register for netlink notifications:
* It Associates the callback routine with the handle so that when
* ipmacsec_netlink_loop() is invoked, it will call the callback routine
* for every received packet or upon timeouts/errors. It also sets supplied
* parameters for the nlhandle.
*
* Note that ipmacsec_netlink_register() can be called again for the same
* nlhandle (assuming mutual exclusions is provided or ipmacsec_netlink_loop()
* is not currently invoked/running) to update the callback, nl_tmo
* and/or exit_loop_on_error.
* Parameters:
* nlhandle - The MACsec netlink handler to register with.
* MUST be allocated with ipmacsec_netlink_open() and
* have a valid netlink socket.
* callback - The callback function to register for this handle.
* nl_tmo - Pointer to a timeout value to be used by the
* ipmacsec_netlink_loop() when invoked.
* A NULL nl_tmo or an nl_tmo containing a 0 value
* means no timeout is set.
* exit_loop_on_error - If set, indicates that ipmacsec_netlink_loop()
* will exit upon an error condition, otherwise
* the callback is invoked with an error condition
* and ipmacsec_netlink_loop() will only exit if
* the callback returns < 0.
* Returns: 0 upon success
* <0 upon failure
*
*/
IP_GLOBAL int
ipmacsec_netlink_register(Ipmacsec_netlink_handle *nlhandle,
IPMACSEC_NL_CB callback, struct Ip_timeval *nl_tmo,
Ip_bool exit_loop_on_error);
/*
*===========================================================================
* ipmacsec_netlink_loop
*===========================================================================
* Description: Invoke a continuous loop that blocks on the netlink socket
* (in the nlhandle).
* The callback will be invoked under these conditions:
* 1- For every successfully received message the nlhandle registred
* callback will be invoked passing a pointer to the nlmsg
* containing the received netlink message, and an error value of 0.
* 2- It will be invoked upon timeouts, in which case a NULL nlmsg
* pointer is provided and a positive error value is returned.
* 3- It will be invoked if socket select/read errors occur
* if the nlhandle exit_loop_on_error is not set. In this case,
* a NULL nlmsg pointer is provided and a negative error value
* is returned.
* 4- It will be invoked when a MACsec netlink EXIT message is
* received on the nlhandler netlink socket, in which case a
* pointer to the the EXIT nlmsg is provided and a positive error
* value is returned.
*
* The loop will only exit upon one of these conditions:
* 1- An error occurs during its initialization.
* 2- An error occurs during socket select/read and
* the nlhandle exit_loop_on_error flag is set.
* 3- The callback routine returns <0 after being invoked.
* 4- A MACsec netlink EXIT message is received.
* Note that if the loop is called with an nlhandle nl_tmo set to
* 0, it may loop/block forever if none of the above conditions are met.
* You can either set a nl_tmo to a certain reasonable value which
* causes your callback to be invoked and it can return -1 to cause
* the loop to exit. Or if nl_tmo is 0, you can use ipmacsec_netlink_loop_exit()
* to send a netlink message to the netlink socket to cause an exit.
*
* Also note that when ipmacsec_netlink_loop() is invoked and while it has not
* returned, the same nlhandle MUST not be passed to another invocation of
* ipmacsec_netlink_request(), ipmacsec_netlink_loop() or ipmacsec_netlink_close()
* unless the caller has provided mutual exclusion for the nlhanle before
* invoking those routines in separate threads/contexts.
*
* Parameters: nlhandle - valid pointer to properly allocated and registered netlink handle
* Returns: >= 0 upon successful exit (including timeout)
* <0 upon exit due to errors
*
*/
IP_GLOBAL int
ipmacsec_netlink_loop(Ipmacsec_netlink_handle *nlhandle);
/*
*===========================================================================
* ipmacsec_netlink_loop_exit
*===========================================================================
* Description: Causes a netlink EXIT message to be sent to the socket
* associated with the specified nl_handle.
* Parameters: nlhandle - Specifies the nlhandle whose socket will receive
* the netlink EXIT message (based on nl_pid of the
* nlhandler local_addr).
* Returns: 0 upon success
* <0 upon error
*
*/
IP_GLOBAL int
ipmacsec_netlink_loop_exit(Ipmacsec_netlink_handle *nlhandle);
/*
*===========================================================================
* ipmacsec_netlink_type_name
*===========================================================================
* Description: Return a string describing the name of a MACsec netlink type
* Parameters: nltype - netlink type to describe
* Returns: String pointer (always != NULL)
*
*/
IP_GLOBAL IP_CONST char *
ipmacsec_netlink_type_name(Ipmacsec_netlink_type nltype);
/*
*===========================================================================
* ipmacsec_nlmsg_alloc
*===========================================================================
* Description: Allocates a netlink message buffer using the buf container.
* Parameters: buf - Pointer to a properly intialized or previously freed
* buffer container.
* Returns: Pointer to allocated and initialized buffer memory,
* IP_NULL if allocation fails.
*
*/
IP_GLOBAL Ip_u8 *
ipmacsec_nlmsg_alloc(Ipmacsec_buffer *buf);
/*
*===========================================================================
* ipmacsec_nlmsg_free
*===========================================================================
* Description: Frees a netlink message buffer.
* Parameters: buf - Pointer to allocated buffer container.
* Returns: 0
*
*/
IP_GLOBAL int
ipmacsec_nlmsg_free(Ipmacsec_buffer *buf);
/*
*===========================================================================
* ipmacsec_nlcmd_add
*===========================================================================
* Description: Adds a netlink command message to a buffer and initializes the
* Ipmacsec_nlcmd_hdr inside the nlmsg netlink message
* updating both in the process along with the buffer container.
* Parameters:
* buf - Pointer to an allocated buffer container.
* nltype - A valid MACsec netlink message type
* cmd - The command type.
* ifname - Valid pointer to an interface name NULL terminated string
* getCmd - TRUE for a get command, FALSE for a set command
* isReply - Indicates a reply (not set by apps)
* Returns: Pointer to the initialized netlink message
* NULL if failed (not enough space or other failure).
*
*/
IP_GLOBAL struct Ip_nlmsghdr *
ipmacsec_nlcmd_add(Ipmacsec_buffer *buf, Ipmacsec_netlink_type nltype, Ipmacsec_lmi_command cmd,
char *ifname, Ip_bool getCmd, Ip_bool isReply);
/*
*===========================================================================
* ipmacsec_nlcmd_get
*===========================================================================
* Description: Retrieves a pointer to an nlcmd from a netlink message
* (only supports one command per message)
* Parameters: nlmsg - Pointer to the netlink message containing the nlcmd
* Returns: pointer to nlcmd_hdr if successful
* IP_NULL if not enough space to contain an nlcmd_hdr or upon error
*
*/
IP_GLOBAL struct Ipmacsec_nlcmd_hdr_struct *
ipmacsec_nlcmd_get(struct Ip_nlmsghdr *nlmsg);
/*
*===========================================================================
* ipmacsec_nlcmd_add_param
*===========================================================================
* Description: Adds a parameter to a MACsec netlink cmd msg and to the
* associated buffer container, updating the buffer container,
* the netlink header and Ipmacsec_nlcmd_hdr in the process.
* May be called repeatedly for the same netlink cmd msg as long as
* there is enough buffer space.
* Parameters:
* buf - Pointer to a valid buffer container.
* nlmsg - Ptr to header for current netlink message being
* manipulated in buffer
* param - Pointer to param to add
* param_size - size of param to add
* Returns: number of octets added if adding a param was successful
* <0 if error (space not available or other error)
*
*/
IP_GLOBAL int
ipmacsec_nlcmd_add_param(Ipmacsec_buffer *buf, struct Ip_nlmsghdr *nlmsg,
void *param, Ip_u32 param_size);
/*
*===========================================================================
* ipmacsec_nlcmd_retrieve_init
*===========================================================================
* Description: Initialize an nlcmd struct before retrieving params.
* Parameters: nlmsg - Ptr to header for current netlink message being parsed
* Returns: >0 is successful (= size of param field), <0 if error occurs
*/
IP_GLOBAL int
ipmacsec_nlcmd_retrieve_init(struct Ip_nlmsghdr *nlmsg);
/*
*===========================================================================
* ipmacsec_nlcmd_retrieve_param
*===========================================================================
* Description: Retrieves a parameter from a MACsec netlink cmd msg
* updating the Ipmacsec_nlcmd_hdr's param_offset in the process.
* May be called repeatedly for the same netlink cmd msg as long as
* there are remaining param bytes.
* Make sure ipmacsec_nlcmd_retrieve_init() is called ONCE and ONLY ONCE
* before subsequent ipmacsec_nlcmd_retrieve_param() calls.
* Note that the paramter remains unchanged in the nlmsg
* (e.g. for retransmission,forwarding, etc.).
* Parameters:
* nlmsg - Ptr to header for current netlink message
* (Must be a valid MACsec netlink command message)
* param - Pointer to data here to store removed param
* If NULL, param is removed but no data copied.
* param_size - size of param to retrieve
* Returns: number of octets removed if a param was successfully removed
* <0 if error (no param bytes or other error)
*
*/
IP_GLOBAL int
ipmacsec_nlcmd_retrieve_param(struct Ip_nlmsghdr *nlmsg, void *param, Ip_u32 param_size);
/*
*===========================================================================
* ipmacsec_nlnote_get
*===========================================================================
* Description: Retrieves a pointer to an nlnote from a netlink message
* (only supports one notification per message)
* Parameters: nlmsg - Pointer to the netlink message containing the nlnote
* Returns: pointer to nlnote_hdr if successful
* IP_NULL if not enough space to contain an nlnote_hdr or upon error
*
*/
IP_GLOBAL struct Ipmacsec_nlnote_hdr_struct *
ipmacsec_nlnote_get(struct Ip_nlmsghdr *nlmsg);
/*
*===========================================================================
* ipmacsec_nlnote_retrieve_init
*===========================================================================
* Description: Initialize an nlnote struct before retrieving params.
* Parameters: nlmsg - Ptr to header for current netlink message being parsed
* Returns: 0 is successful, <0 if error occurs
*/
IP_GLOBAL int
ipmacsec_nlnote_retrieve_init(struct Ip_nlmsghdr *nlmsg);
/*
*===========================================================================
* ipmacsec_nlnote_retrieve_param
*===========================================================================
* Description: Retrieves a parameter from a MACsec netlink note msg
* updating the Ipmacsec_nlnote_hdr's param_offset in the process.
* May be called repeatedly for the same netlink note msg as long as
* there are remaining param bytes.
* Make sure ipmacsec_nlnote_retrieve_init() is called ONCE and ONLY ONCE
* before subsequent ipmacsec_nlnote_retrieve_param() calls.
* Note that the paramter remains unchanged in the nlmsg
* (e.g. for retransmission,forwarding, etc.).
* Parameters:
* nlmsg - Ptr to header for current netlink message
* (Must be a valid MACsec netlink notification message)
* param - Pointer to data here to store removed param
* If NULL, param is removed but no data copied.
* param_size - size of param to retrieve
* Returns: number of octets removed if a param was successfully removed
* <0 if error (no param bytes or other error)
*
*/
IP_GLOBAL int
ipmacsec_nlnote_retrieve_param(struct Ip_nlmsghdr *nlmsg, void *param, Ip_u32 param_size);
/*
****************************************************************************
* 6 PRIVATE FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipmacsec_nlcmd_response_add
*===========================================================================
* Description: Add a command response netlink message to a buffer.
* Parameters: reply - buffer container to add response netlink command message to
* nlmsg - request message being replied to
* param - optional parameter pointer
* param_size - size of optional param
* src_pid - pid to respond to
* Returns: Pointer to response message upon success, IP_NULL on failure
*
*/
IPMACSEC_PRIVATE struct Ip_nlmsghdr *
ipmacsec_nlcmd_response_add(Ipmacsec_buffer *reply, struct Ip_nlmsghdr *nlreq,
void *param, Ip_u32 param_size, Ip_pid_t src_pid);
/*
*===========================================================================
* ipmacsec_nlnote_add
*===========================================================================
* Description: Adds a netlink notification message to a buffer and initializes the
* Ipmacsec_nlnote_hdr inside the nlmsg netlink message
* updating both in the process along with the buffer container.
* Parameters:
* buf - Pointer to an allocated buffer container.
* nltype - A valid MACsec netlink message type
* note - The notification type.
* ifname - Valid pointer to an interface name NULL terminated string
* Returns: Pointer to the initialized netlink message
* NULL if failed (not enough space or other failure).
*
*/
IPMACSEC_PRIVATE struct Ip_nlmsghdr *
ipmacsec_nlnote_add(Ipmacsec_buffer *buf, Ipmacsec_netlink_type nltype, Ipmacsec_lmi_note note,
char *ifname);
/*
*===========================================================================
* ipmacsec_nlnote_add_param
*===========================================================================
* Description: Adds a parameter to a MACsec netlink note msg and to the
* associated buffer container, updating the buffer container,
* the netlink header and Ipmacsec_nlnote_hdr in the process.
* May be called repeatedly for the same netlink note msg as long as
* there is enough buffer space.
* Parameters:
* buf - Pointer to a valid buffer container.
* nlmsg - Ptr to header for current netlink message being
* manipulated in buffer
* param - Pointer to param to add
* param_size - size of param to add
* Returns: number of octets added if adding a param was successful
* <0 if error (space not available or other error)
*
*/
IPMACSEC_PRIVATE int
ipmacsec_nlnote_add_param(Ipmacsec_buffer *buf, struct Ip_nlmsghdr *nlmsg,
void *param, Ip_u32 param_size);
/*
*===========================================================================
* ipmacsec_netlink_broadcast
*===========================================================================
* Description: Broadcast a MACsec netlink message to specified groups
* Parameters: secy - MACsec secy instance pointer
* notification - Pointer to buffer containing the notification
* netlink message payload.
* size - size of notification buffer
* nl_type - netlink message type
* nl_flags - netlink message flags
* msg_group - netlink groups to bcast message to
* Returns: 0 upon success
* <0 on error
*
*/
IPMACSEC_PRIVATE int
ipmacsec_netlink_broadcast(Ipnet_secy *secy, Ip_u8 *notification, Ip_u32 size,
Ipmacsec_netlink_type nl_type, Ip_u16 nl_flags,
Ip_macsec_netlink_groups msg_group);
#endif
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/