Prototype sink.h for lightweight tunnels

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
diff --git a/include/net/sink.h b/include/net/sink.h
new file mode 100644
index 0000000..4e26792
--- /dev/null
+++ b/include/net/sink.h
@@ -0,0 +1,125 @@
+/*
+ * net/sink.h	Protocol independent lightweight packet sink.
+ *
+ * Authors:	Eric Biederman <ebiederm@xmission.com>
+ */
+#ifndef _NET_SINK_H
+#define _NET_SINK_H
+
+#include <linux/netdev_features.h>
+
+struct sink;
+struct header_ops;
+struct neigh_parms;
+struct seq_file;
+
+struct sink_ops {
+	int				(*sink_output)(struct sink *, struct sk_buff *);
+	void				(*sink_hold)(struct sink *);
+	void				(*sink_put)(struct sink *);
+	struct net *			(*sink_net)(struct sink *);
+	struct net_device *		(*sink_dev)(struct sink *);
+	const struct header_ops *	(*sink_header_ops)(struct sink *);
+	struct neigh_parms *		(*sink_arp_parms)(struct sink *);
+	unsigned int			(*sink_type)(struct sink *sink);
+	unsigned int			(*sink_hh_len)(struct sink *);
+	unsigned int			(*sink_mtu)(struct sink *);
+	int				(*sink_ifindex)(struct sink *);
+	unsigned short			(*sink_ha_type)(struct sink *);
+	unsigned char			(*sink_ha_len)(struct sink *);
+	unsigned char *			(*sink_ha_addr)(struct sink *);
+	unsigned char *			(*sink_ha_broadcast)(struct sink *);
+	netdev_features_t		(*sink_features)(struct sink *);
+	int				(*sink_seq_name)(struct seq_file *, struct sink *);
+};
+
+struct sink {
+	const struct sink_ops *ops;
+};
+
+static inline int sink_output(struct sink *sink, struct sk_buff *skb)
+{
+	return sink->ops->sink_output(sink, skb);
+}
+
+static inline void sink_hold(struct sink *sink)
+{
+	return sink->ops->sink_hold(sink);
+}
+
+static inline void sink_put(struct sink *sink)
+{
+	return sink->ops->sink_put(sink);
+}
+
+static inline struct net *sink_net(struct sink *sink)
+{
+	return sink->ops->sink_net(sink);
+}
+
+static inline struct net_device *sink_dev(struct sink *sink)
+{
+	return sink->ops->sink_dev(sink);
+}
+
+static inline const struct header_ops *sink_header_ops(struct sink *sink)
+{
+	return sink->ops->sink_header_ops(sink);
+}
+
+static inline struct neigh_parms *sink_arp_parms(struct sink *sink)
+{
+	return sink->ops->sink_arp_parms(sink);
+}
+
+static inline unsigned int sink_type(struct sink *sink)
+{
+	return sink->ops->sink_type(sink);
+}
+
+static inline unsigned int sink_hh_len(struct sink *sink)
+{
+	return sink->ops->sink_hh_len(sink);
+}
+
+static inline unsigned int sink_mtu(struct sink *sink)
+{
+	return sink->ops->sink_mtu(sink);
+}
+
+static inline int sink_ifindex(struct sink *sink)
+{
+	return sink->ops->sink_ifindex(sink);
+}
+
+static inline unsigned short sink_ha_type(struct sink *sink)
+{
+	return sink->ops->sink_ha_type(sink);
+}
+
+static inline unsigned char sink_ha_len(struct sink *sink)
+{
+	return sink->ops->sink_ha_len(sink);
+}
+
+static inline unsigned char *sink_ha_addr(struct sink *sink)
+{
+	return sink->ops->sink_ha_addr(sink);
+}
+
+static inline unsigned char *sink_ha_broadcast(struct sink *sink)
+{
+	return sink->ops->sink_ha_broadcast(sink);
+}
+
+static inline netdev_features_t sink_features(struct sink *sink)
+{
+	return sink->ops->sink_features(sink);
+}
+
+static inline int sink_seq_name(struct seq_file *seq, struct sink *sink)
+{
+	return sink->ops->sink_seq_name(seq, sink);
+}
+
+#endif /* _NET_SINK_H */