0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef __NET_MCTP_H
0010 #define __NET_MCTP_H
0011
0012 #include <linux/bits.h>
0013 #include <linux/mctp.h>
0014 #include <linux/netdevice.h>
0015 #include <net/net_namespace.h>
0016 #include <net/sock.h>
0017
0018
0019 struct mctp_hdr {
0020 u8 ver;
0021 u8 dest;
0022 u8 src;
0023 u8 flags_seq_tag;
0024 };
0025
0026 #define MCTP_VER_MIN 1
0027 #define MCTP_VER_MAX 1
0028
0029
0030 #define MCTP_HDR_FLAG_SOM BIT(7)
0031 #define MCTP_HDR_FLAG_EOM BIT(6)
0032 #define MCTP_HDR_FLAG_TO BIT(3)
0033 #define MCTP_HDR_FLAGS GENMASK(5, 3)
0034 #define MCTP_HDR_SEQ_SHIFT 4
0035 #define MCTP_HDR_SEQ_MASK GENMASK(1, 0)
0036 #define MCTP_HDR_TAG_SHIFT 0
0037 #define MCTP_HDR_TAG_MASK GENMASK(2, 0)
0038
0039 #define MCTP_INITIAL_DEFAULT_NET 1
0040
0041 static inline bool mctp_address_unicast(mctp_eid_t eid)
0042 {
0043 return eid >= 8 && eid < 255;
0044 }
0045
0046 static inline bool mctp_address_broadcast(mctp_eid_t eid)
0047 {
0048 return eid == 255;
0049 }
0050
0051 static inline bool mctp_address_null(mctp_eid_t eid)
0052 {
0053 return eid == 0;
0054 }
0055
0056 static inline bool mctp_address_matches(mctp_eid_t match, mctp_eid_t eid)
0057 {
0058 return match == eid || match == MCTP_ADDR_ANY;
0059 }
0060
0061 static inline struct mctp_hdr *mctp_hdr(struct sk_buff *skb)
0062 {
0063 return (struct mctp_hdr *)skb_network_header(skb);
0064 }
0065
0066
0067 struct mctp_sock {
0068 struct sock sk;
0069
0070
0071 unsigned int bind_net;
0072 mctp_eid_t bind_addr;
0073 __u8 bind_type;
0074
0075
0076 bool addr_ext;
0077
0078
0079
0080
0081 struct hlist_head keys;
0082
0083
0084
0085
0086 struct timer_list key_expiry;
0087 };
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 struct mctp_sk_key {
0136 mctp_eid_t peer_addr;
0137 mctp_eid_t local_addr;
0138 __u8 tag;
0139
0140
0141 struct sock *sk;
0142
0143
0144 struct hlist_node hlist;
0145
0146
0147 struct hlist_node sklist;
0148
0149
0150
0151
0152 spinlock_t lock;
0153
0154
0155 refcount_t refs;
0156
0157
0158 struct sk_buff *reasm_head;
0159 struct sk_buff **reasm_tailp;
0160 bool reasm_dead;
0161 u8 last_seq;
0162
0163
0164 bool valid;
0165
0166
0167 unsigned long expiry;
0168
0169
0170
0171
0172 unsigned long dev_flow_state;
0173 struct mctp_dev *dev;
0174
0175
0176
0177
0178
0179 bool manual_alloc;
0180 };
0181
0182 struct mctp_skb_cb {
0183 unsigned int magic;
0184 unsigned int net;
0185 int ifindex;
0186 mctp_eid_t src;
0187 unsigned char halen;
0188 unsigned char haddr[MAX_ADDR_LEN];
0189 };
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200 static inline struct mctp_skb_cb *__mctp_cb(struct sk_buff *skb)
0201 {
0202 struct mctp_skb_cb *cb = (void *)skb->cb;
0203
0204 cb->magic = 0x4d435450;
0205 return cb;
0206 }
0207
0208 static inline struct mctp_skb_cb *mctp_cb(struct sk_buff *skb)
0209 {
0210 struct mctp_skb_cb *cb = (void *)skb->cb;
0211
0212 BUILD_BUG_ON(sizeof(struct mctp_skb_cb) > sizeof(skb->cb));
0213 WARN_ON(cb->magic != 0x4d435450);
0214 return (void *)(skb->cb);
0215 }
0216
0217
0218
0219
0220 struct mctp_flow {
0221 struct mctp_sk_key *key;
0222 };
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234 struct mctp_route {
0235 mctp_eid_t min, max;
0236
0237 struct mctp_dev *dev;
0238 unsigned int mtu;
0239 unsigned char type;
0240 int (*output)(struct mctp_route *route,
0241 struct sk_buff *skb);
0242
0243 struct list_head list;
0244 refcount_t refs;
0245 struct rcu_head rcu;
0246 };
0247
0248
0249 struct mctp_route *mctp_route_lookup(struct net *net, unsigned int dnet,
0250 mctp_eid_t daddr);
0251
0252 int mctp_local_output(struct sock *sk, struct mctp_route *rt,
0253 struct sk_buff *skb, mctp_eid_t daddr, u8 req_tag);
0254
0255 void mctp_key_unref(struct mctp_sk_key *key);
0256 struct mctp_sk_key *mctp_alloc_local_tag(struct mctp_sock *msk,
0257 mctp_eid_t daddr, mctp_eid_t saddr,
0258 bool manual, u8 *tagp);
0259
0260
0261 unsigned int mctp_default_net(struct net *net);
0262 int mctp_default_net_set(struct net *net, unsigned int index);
0263 int mctp_route_add_local(struct mctp_dev *mdev, mctp_eid_t addr);
0264 int mctp_route_remove_local(struct mctp_dev *mdev, mctp_eid_t addr);
0265 void mctp_route_remove_dev(struct mctp_dev *mdev);
0266
0267
0268 enum mctp_neigh_source {
0269 MCTP_NEIGH_STATIC,
0270 MCTP_NEIGH_DISCOVER,
0271 };
0272
0273 struct mctp_neigh {
0274 struct mctp_dev *dev;
0275 mctp_eid_t eid;
0276 enum mctp_neigh_source source;
0277
0278 unsigned char ha[MAX_ADDR_LEN];
0279
0280 struct list_head list;
0281 struct rcu_head rcu;
0282 };
0283
0284 int mctp_neigh_init(void);
0285 void mctp_neigh_exit(void);
0286
0287
0288 int mctp_neigh_lookup(struct mctp_dev *dev, mctp_eid_t eid,
0289 void *ret_hwaddr);
0290 void mctp_neigh_remove_dev(struct mctp_dev *mdev);
0291
0292 int mctp_routes_init(void);
0293 void mctp_routes_exit(void);
0294
0295 void mctp_device_init(void);
0296 void mctp_device_exit(void);
0297
0298 #endif