11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef MPOA_CACHES_H
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MPOA_CACHES_H
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netdevice.h>
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/atm.h>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/atmdev.h>
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/atmmpc.h>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct mpoa_client;
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid atm_mpoa_init_cache(struct mpoa_client *mpc);
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct in_cache_entry {
15f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct in_cache_entry *next;
16f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct in_cache_entry *prev;
17f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct timeval  tv;
18f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct timeval  reply_wait;
19f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct timeval  hold_down;
20f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint32_t  packets_fwded;
21f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint16_t  entry_state;
22f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint32_t retry_time;
23f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint32_t refresh_time;
24f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint32_t count;
25f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct   atm_vcc *shortcut;
26f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint8_t  MPS_ctrl_ATM_addr[ATM_ESA_LEN];
27f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct   in_ctrl_info ctrl_info;
28f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	atomic_t use;
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} in_cache_entry;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct in_cache_ops{
32f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	in_cache_entry *(*add_entry)(__be32 dst_ip,
33f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki				      struct mpoa_client *client);
34f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	in_cache_entry *(*get)(__be32 dst_ip, struct mpoa_client *client);
35f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	in_cache_entry *(*get_with_mask)(__be32 dst_ip,
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 struct mpoa_client *client,
3730d492da738a8d5f4ec884b3e1a13eef97714994Al Viro					 __be32 mask);
38f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	in_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc,
39f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki				      struct mpoa_client *client);
40f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*put)(in_cache_entry *entry);
41f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*remove_entry)(in_cache_entry *delEntry,
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					struct mpoa_client *client );
43f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	int             (*cache_hit)(in_cache_entry *entry,
44f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki				     struct mpoa_client *client);
45f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*clear_count)(struct mpoa_client *client);
46f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*check_resolving)(struct mpoa_client *client);
47f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*refresh)(struct mpoa_client *client);
48f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*destroy_cache)(struct mpoa_client *mpc);
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct eg_cache_entry{
52f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct               eg_cache_entry *next;
53f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct               eg_cache_entry *prev;
54f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct               timeval  tv;
55f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint8_t              MPS_ctrl_ATM_addr[ATM_ESA_LEN];
56f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct atm_vcc       *shortcut;
57f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint32_t             packets_rcvd;
58f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	uint16_t             entry_state;
59f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	__be32             latest_ip_addr;    /* The src IP address of the last packet */
60f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	struct eg_ctrl_info  ctrl_info;
61f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	atomic_t             use;
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} eg_cache_entry;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct eg_cache_ops{
65f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	eg_cache_entry *(*add_entry)(struct k_message *msg, struct mpoa_client *client);
66f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	eg_cache_entry *(*get_by_cache_id)(__be32 cache_id, struct mpoa_client *client);
67f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	eg_cache_entry *(*get_by_tag)(__be32 cache_id, struct mpoa_client *client);
68f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	eg_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc, struct mpoa_client *client);
69f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	eg_cache_entry *(*get_by_src_ip)(__be32 ipaddr, struct mpoa_client *client);
70f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*put)(eg_cache_entry *entry);
71f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*remove_entry)(eg_cache_entry *entry, struct mpoa_client *client);
72f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*update)(eg_cache_entry *entry, uint16_t holding_time);
73f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*clear_expired)(struct mpoa_client *client);
74f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki	void            (*destroy_cache)(struct mpoa_client *mpc);
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ingress cache entry states */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INGRESS_REFRESHING 3
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INGRESS_RESOLVED   2
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INGRESS_RESOLVING  1
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INGRESS_INVALID    0
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* VCC states */
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN   1
88f7d57453d20e27de69ecafd121005e9d13a0f427YOSHIFUJI Hideaki#define CLOSED 0
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Egress cache entry states */
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EGRESS_RESOLVED 2
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EGRESS_PURGE    1
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EGRESS_INVALID  0
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
97