if: Add ioctls to get RSS key and hash type/function.

It will be needed by hn(4) to configure its RSS key and hash
type/function in the transparent VF mode in order to match VF's
RSS settings. The description of the transparent VF mode and
the RSS hash value issue are here:
https://svnweb.freebsd.org/base?view=revision&revision=322299
https://svnweb.freebsd.org/base?view=revision&revision=322485

These are generic enough to promise two independent IOCs instead
of abusing SIOCGDRVSPEC.

Setting RSS key and hash type/function is a different story,
which probably requires more discussion.

Comment about UDP_{IPV4,IPV6,IPV6_EX} were only in the patch
in the review request; these hash types are standardized now.

Reviewed by:	gallatin
MFC after:	1 week
Sponsored by:	Microsoft
Differential Revision:	https://reviews.freebsd.org/D12174
This commit is contained in:
Sepherosa Ziehau 2017-09-05 05:28:52 +00:00
parent afd2f355fb
commit 0f3af0411d
3 changed files with 42 additions and 0 deletions

View File

@ -2661,6 +2661,8 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
case SIOCGIFMEDIA:
case SIOCGIFXMEDIA:
case SIOCGIFGENERIC:
case SIOCGIFRSSKEY:
case SIOCGIFRSSHASH:
if (ifp->if_ioctl == NULL)
return (EOPNOTSUPP);
error = (*ifp->if_ioctl)(ifp, cmd, data);

View File

@ -526,6 +526,42 @@ struct ifi2creq {
uint8_t data[8]; /* read buffer */
};
/*
* RSS hash.
*/
#define RSS_FUNC_NONE 0 /* RSS disabled */
#define RSS_FUNC_PRIVATE 1 /* non-standard */
#define RSS_FUNC_TOEPLITZ 2
#define RSS_TYPE_IPV4 0x00000001
#define RSS_TYPE_TCP_IPV4 0x00000002
#define RSS_TYPE_IPV6 0x00000004
#define RSS_TYPE_IPV6_EX 0x00000008
#define RSS_TYPE_TCP_IPV6 0x00000010
#define RSS_TYPE_TCP_IPV6_EX 0x00000020
#define RSS_TYPE_UDP_IPV4 0x00000040
#define RSS_TYPE_UDP_IPV6 0x00000080
#define RSS_TYPE_UDP_IPV6_EX 0x00000100
#define RSS_KEYLEN 128
struct ifrsskey {
char ifrk_name[IFNAMSIZ]; /* if name, e.g. "en0" */
uint8_t ifrk_func; /* RSS_FUNC_ */
uint8_t ifrk_spare0;
uint16_t ifrk_keylen;
uint8_t ifrk_key[RSS_KEYLEN];
};
struct ifrsshash {
char ifrh_name[IFNAMSIZ]; /* if name, e.g. "en0" */
uint8_t ifrh_func; /* RSS_FUNC_ */
uint8_t ifrh_spare0;
uint16_t ifrh_spare1;
uint32_t ifrh_types; /* RSS_TYPE_ */
};
#endif /* __BSD_VISIBLE */
#ifdef _KERNEL

View File

@ -134,4 +134,8 @@
#define SIOCGIFGMEMB _IOWR('i', 138, struct ifgroupreq) /* get members */
#define SIOCGIFXMEDIA _IOWR('i', 139, struct ifmediareq) /* get net xmedia */
#define SIOCGIFRSSKEY _IOWR('i', 150, struct ifrsskey)/* get RSS key */
#define SIOCGIFRSSHASH _IOWR('i', 151, struct ifrsshash)/* get the current RSS
type/func settings */
#endif /* !_SYS_SOCKIO_H_ */