File: net_alias.h

package info (click to toggle)
kernel-source-2.0.38 2.0.38-3
  • links: PTS
  • area: main
  • in suites: potato
  • size: 34,660 kB
  • ctags: 102,964
  • sloc: ansic: 632,204; asm: 26,444; makefile: 4,286; sh: 1,276; perl: 761; tcl: 408; cpp: 277; lisp: 211; awk: 134
file content (220 lines) | stat: -rw-r--r-- 6,052 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
 *		NET_ALIAS network device aliasing definitions.
 *
 *
 * Version:	@(#)net_alias.h	0.50   4/20/97
 *
 * Author:	Juan Jose Ciarlante, <jjciarla@raiz.uncu.edu.ar>
 *
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License
 *	as published by the Free Software Foundation; either version
 *	2 of the License, or (at your option) any later version.
 *	
 * Fixes:
 *	Juan Jose Ciarlante	:	Added tx/rx stats for aliases.
 *	Juan Jose Ciarlante 	:	hash_tab size now in net_alias.c
 *	Juan Jose Ciarlante	:	added sysctl interface
 */

#ifndef _NET_ALIAS_H
#define _NET_ALIAS_H

#include <linux/types.h>
#include <linux/if.h>
#include <linux/netdevice.h>

struct net_alias;
struct net_alias_info;
struct net_alias_type;


/*
 * main alias structure
 * note that *defines* dev & devname
 */

struct net_alias
{
  struct device dev;		/* alias device defn*/
  char name[IFNAMSIZ];		/* device name defn */
  unsigned hash;		/* my hash value: for quick rehash */
  unsigned slot;		/* slot number */
  void *data;			/* private data */
  struct device *main_dev;	/* pointer to main device */
  struct net_alias_type *nat;	/* alias type object bound */
  struct net_alias *next;	/* next alias (hashed linked list) */
  unsigned long rx_lookups;     /* 'fake' rx pkts */
  unsigned long tx_lookups;     /* 'fake' tx pkts */
};


/*
 *  alias structure pointed by main device
 *  it holds main device's alias hash table
 */

struct net_alias_info
{
  int n_aliases;		/* num aliases */
  int truesize;                 /* actual malloc size for struct + hashtab */
  struct device *taildev;	/* my last (alias) device */
  int max_aliases;              /* max aliases allowed for main device */
  unsigned hash_tab_size;       /* hash_tab size in elements */
  struct net_alias *hash_tab[0]; /* hashed alias table */
};

/*
 * net_alias_type class
 * declares a generic (AF_ independent) structure that will
 * manage generic to family-specific behavior.
 */

struct net_alias_type
{
  int type;			/* aliasing type: address family */
  int n_attach;	 		/* number of aliases attached */
  char name[16];		/* af_name */
  __u32 (*get_addr32)		/* get __u32 addr 'representation'*/
    (struct net_alias_type *this, struct sockaddr*);	
  int (*dev_addr_chk)		/* address checking func: */
    (struct net_alias_type *this, struct device *, struct sockaddr *);
  struct device * (*dev_select)	/* closest alias selector*/
    (struct net_alias_type *this, struct device *, struct sockaddr *sa);
  int (*alias_init_1)		/* called after alias creation: */
    (struct net_alias_type *this,struct net_alias *alias, struct sockaddr *sa);
  int (*alias_done_1)		/* called before alias deletion */
    (struct net_alias_type *this, struct net_alias *alias);
  int (*alias_print_1)	
    (struct net_alias_type *this, struct net_alias *alias, char *buf, int len);
  struct net_alias_type *next;	/* link */
};


/*
 * is dev an alias?
 */

static __inline__ int
net_alias_is(struct device *dev)
{
  return (dev->my_alias != NULL);
}


/*
 * does dev have aliases?
 */

static __inline__ int
net_alias_has(struct device *dev)
{
  return (dev->alias_info != NULL);
}

/*
 *	Initialise net_alias module
 */
extern void net_alias_init(void);

/*
 *	dev_get() with added aliasing magic
 */
extern struct device * net_alias_dev_get(char *dev_name, int aliasing_ok, int *err, struct sockaddr *sa, void *data);
extern int net_alias_dev_rehash(struct device *dev, struct sockaddr *sa);

/*
 *	PROC_FS entries
 */
extern int net_alias_getinfo(char *buf, char **, off_t , int , int );
extern int net_alias_types_getinfo(char *buf, char **, off_t , int , int );

/*
 *	net_alias_type (address family) registration 
 */
extern int register_net_alias_type(struct net_alias_type *nat, int type);
extern int unregister_net_alias_type(struct net_alias_type *nat);

/*
 *	get alias device _with_ specified address
 */
extern struct device * net_alias_dev_chk(struct device *main_dev, struct sockaddr *sa, int flags_on, int flags_off);
extern struct device * net_alias_dev_chk32(struct device *main_dev, int family, __u32 addr32, int flags_on, int flags_off);

/*
 *	get 'closest' device to specified address (returns main_dev if
 *	nothing better)
 *	if succesfull, also increment rx stats.
 */
extern struct device * net_alias_dev_rx(struct device *main_dev, struct sockaddr *sa_src, struct sockaddr *sa_dst);
extern struct device * net_alias_dev_rx32(struct device *main_dev, int family, __u32 src, __u32 dst);


/*
 * returns MY 'true' main device
 * intended for alias devices
 */

static __inline__ struct device *net_alias_main_dev(struct device *dev)
{
  return (net_alias_is(dev))? dev->my_alias->main_dev : dev;
}


/*
 * returns NEXT 'true' device
 * intended for true devices
 */

static __inline__ struct device *
net_alias_nextdev(struct device *dev)
{
  return (dev->alias_info)? dev->alias_info->taildev->next : dev->next;
}


/*
 * sets NEXT 'true' device
 * intended for main devices (treat main device as block: dev+aliases).
 */

static __inline__ struct device *
net_alias_nextdev_set(struct device *dev, struct device *nextdev)
{
  struct device *pdev = dev;
  if (net_alias_has(dev))
  {
    pdev = dev->alias_info->taildev; /* point to last dev alias */
  }
  pdev->next = nextdev;
  return nextdev;
}

/*
 *	lookup counters (used for alias devices stats)
 */
static __inline__ void net_alias_inc_rx(struct net_alias *alias)
{
        if (alias != NULL) alias->rx_lookups++;
}
static __inline__ void net_alias_inc_tx(struct net_alias *alias)
{
        if (alias != NULL) alias->tx_lookups++;
}

/*
 *	To be called when passing down a pkt, to _switch_ from alias device
 *	to actual device, also incr. alias tx counter.
 */
static __inline__ struct device *net_alias_dev_tx(struct device *dev)
{
        struct net_alias *alias = dev->my_alias;
        if (alias) {
                net_alias_inc_tx(alias);
                return alias->main_dev;
        } 
        return dev;
}

#endif  /* _NET_ALIAS_H */