1/* 2 * netlink/genl/family.h Generic Netlink Family 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation version 2.1 7 * of the License. 8 * 9 * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> 10 */ 11 12#ifndef NETLINK_GENL_FAMILY_H_ 13#define NETLINK_GENL_FAMILY_H_ 14 15#include <netlink/netlink.h> 16#include <netlink/cache.h> 17 18#ifdef __cplusplus 19extern "C" { 20#endif 21 22/** @cond SKIP */ 23#define FAMILY_ATTR_ID 0x01 24#define FAMILY_ATTR_NAME 0x02 25#define FAMILY_ATTR_VERSION 0x04 26#define FAMILY_ATTR_HDRSIZE 0x08 27#define FAMILY_ATTR_MAXATTR 0x10 28#define FAMILY_ATTR_OPS 0x20 29 30 31struct genl_family 32{ 33 NLHDR_COMMON 34 35 uint16_t gf_id; 36 char gf_name[GENL_NAMSIZ]; 37 uint32_t gf_version; 38 uint32_t gf_hdrsize; 39 uint32_t gf_maxattr; 40 41 struct nl_list_head gf_ops; 42}; 43 44 45extern struct genl_family * genl_family_alloc(void); 46extern void genl_family_put(struct genl_family *); 47 48extern int genl_family_add_op(struct genl_family *, 49 int, int); 50 51/** 52 * @name Attributes 53 * @{ 54 */ 55 56static inline unsigned int genl_family_get_id(struct genl_family *family) 57{ 58 if (family->ce_mask & FAMILY_ATTR_ID) 59 return family->gf_id; 60 else 61 return GENL_ID_GENERATE; 62} 63 64static inline void genl_family_set_id(struct genl_family *family, unsigned int id) 65{ 66 family->gf_id = id; 67 family->ce_mask |= FAMILY_ATTR_ID; 68} 69 70static inline char *genl_family_get_name(struct genl_family *family) 71{ 72 if (family->ce_mask & FAMILY_ATTR_NAME) 73 return family->gf_name; 74 else 75 return NULL; 76} 77 78static inline void genl_family_set_name(struct genl_family *family, const char *name) 79{ 80 strncpy(family->gf_name, name, GENL_NAMSIZ-1); 81 family->ce_mask |= FAMILY_ATTR_NAME; 82} 83 84static inline uint8_t genl_family_get_version(struct genl_family *family) 85{ 86 if (family->ce_mask & FAMILY_ATTR_VERSION) 87 return family->gf_version; 88 else 89 return 0; 90} 91 92static inline void genl_family_set_version(struct genl_family *family, uint8_t version) 93{ 94 family->gf_version = version; 95 family->ce_mask |= FAMILY_ATTR_VERSION; 96} 97 98static inline uint32_t genl_family_get_hdrsize(struct genl_family *family) 99{ 100 if (family->ce_mask & FAMILY_ATTR_HDRSIZE) 101 return family->gf_hdrsize; 102 else 103 return 0; 104} 105 106static inline void genl_family_set_hdrsize(struct genl_family *family, uint32_t hdrsize) 107{ 108 family->gf_hdrsize = hdrsize; 109 family->ce_mask |= FAMILY_ATTR_HDRSIZE; 110} 111 112static inline uint32_t genl_family_get_maxattr(struct genl_family *family) 113{ 114 if (family->ce_mask & FAMILY_ATTR_MAXATTR) 115 return family->gf_maxattr; 116 else 117 return family->gf_maxattr; 118} 119 120static inline void genl_family_set_maxattr(struct genl_family *family, uint32_t maxattr) 121{ 122 family->gf_maxattr = maxattr; 123 family->ce_mask |= FAMILY_ATTR_MAXATTR; 124} 125 126#ifdef __cplusplus 127} 128#endif 129 130#endif 131