summaryrefslogtreecommitdiffstats
path: root/include/linux/net_alias.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/net_alias.h')
-rw-r--r--include/linux/net_alias.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/include/linux/net_alias.h b/include/linux/net_alias.h
new file mode 100644
index 000000000..67a9f9bea
--- /dev/null
+++ b/include/linux/net_alias.h
@@ -0,0 +1,172 @@
+/*
+ * NET_ALIAS network device aliasing definitions.
+ *
+ *
+ * Version: @(#)net_alias.h 0.43 12/20/95
+ *
+ * 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.
+ *
+ */
+
+#ifndef _NET_ALIAS_H
+#define _NET_ALIAS_H
+
+#include <linux/types.h>
+#include <linux/if.h>
+#include <linux/netdevice.h>
+
+/*
+ * max. alias slot number allowed
+ */
+
+#define NET_ALIAS_MAX_SLOT 256
+
+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) */
+};
+
+
+/*
+ * alias structure pointed by main device
+ * it holds main device's alias hash table
+ */
+
+struct net_alias_info
+{
+ int n_aliases; /* num aliases */
+ struct device *taildev; /* my last (alias) device */
+ struct net_alias *hash_tab[16]; /* 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);
+}
+
+
+extern void net_alias_init(void);
+
+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);
+
+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 );
+
+extern int register_net_alias_type(struct net_alias_type *nat, int type);
+extern int unregister_net_alias_type(struct net_alias_type *nat);
+
+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);
+
+extern struct device * net_alias_dev_rcv_sel(struct device *main_dev, struct sockaddr *sa_src, struct sockaddr *sa_dst);
+extern struct device * net_alias_dev_rcv_sel32(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;
+}
+
+#endif /* _NET_ALIAS_H */