0001
0002 #ifndef _NET_DN_ROUTE_H
0003 #define _NET_DN_ROUTE_H
0004
0005
0006
0007
0008
0009
0010 #include <linux/types.h>
0011 #include <net/dst.h>
0012
0013 struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri);
0014 int dn_route_output_sock(struct dst_entry __rcu **pprt, struct flowidn *,
0015 struct sock *sk, int flags);
0016 int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb);
0017 void dn_rt_cache_flush(int delay);
0018 int dn_route_rcv(struct sk_buff *skb, struct net_device *dev,
0019 struct packet_type *pt, struct net_device *orig_dev);
0020
0021
0022 #define DN_RT_F_PID 0x07
0023 #define DN_RT_F_PF 0x80
0024 #define DN_RT_F_VER 0x40
0025 #define DN_RT_F_IE 0x20
0026 #define DN_RT_F_RTS 0x10
0027 #define DN_RT_F_RQR 0x08
0028
0029
0030 #define DN_RT_PKT_MSK 0x06
0031
0032 #define DN_RT_PKT_SHORT 0x02
0033 #define DN_RT_PKT_LONG 0x06
0034
0035
0036 #define DN_RT_PKT_CNTL 0x01
0037
0038 #define DN_RT_CNTL_MSK 0x0f
0039 #define DN_RT_PKT_INIT 0x01
0040 #define DN_RT_PKT_VERI 0x03
0041 #define DN_RT_PKT_HELO 0x05
0042 #define DN_RT_PKT_L1RT 0x07
0043 #define DN_RT_PKT_L2RT 0x09
0044 #define DN_RT_PKT_ERTH 0x0b
0045 #define DN_RT_PKT_EEDH 0x0d
0046
0047
0048 #define DN_RT_INFO_TYPE 0x03
0049 #define DN_RT_INFO_L1RT 0x02
0050 #define DN_RT_INFO_L2RT 0x01
0051 #define DN_RT_INFO_ENDN 0x03
0052 #define DN_RT_INFO_VERI 0x04
0053 #define DN_RT_INFO_RJCT 0x08
0054 #define DN_RT_INFO_VFLD 0x10
0055 #define DN_RT_INFO_NOML 0x20
0056 #define DN_RT_INFO_BLKR 0x40
0057
0058
0059
0060
0061
0062
0063
0064
0065 struct dn_route {
0066 struct dst_entry dst;
0067 struct dn_route __rcu *dn_next;
0068
0069 struct neighbour *n;
0070
0071 struct flowidn fld;
0072
0073 __le16 rt_saddr;
0074 __le16 rt_daddr;
0075 __le16 rt_gateway;
0076 __le16 rt_local_src;
0077 __le16 rt_src_map;
0078 __le16 rt_dst_map;
0079
0080 unsigned int rt_flags;
0081 unsigned int rt_type;
0082 };
0083
0084 static inline bool dn_is_input_route(struct dn_route *rt)
0085 {
0086 return rt->fld.flowidn_iif != 0;
0087 }
0088
0089 static inline bool dn_is_output_route(struct dn_route *rt)
0090 {
0091 return rt->fld.flowidn_iif == 0;
0092 }
0093
0094 void dn_route_init(void);
0095 void dn_route_cleanup(void);
0096
0097 #include <net/sock.h>
0098 #include <linux/if_arp.h>
0099
0100 static inline void dn_rt_send(struct sk_buff *skb)
0101 {
0102 dev_queue_xmit(skb);
0103 }
0104
0105 static inline void dn_rt_finish_output(struct sk_buff *skb, char *dst, char *src)
0106 {
0107 struct net_device *dev = skb->dev;
0108
0109 if ((dev->type != ARPHRD_ETHER) && (dev->type != ARPHRD_LOOPBACK))
0110 dst = NULL;
0111
0112 if (dev_hard_header(skb, dev, ETH_P_DNA_RT, dst, src, skb->len) >= 0)
0113 dn_rt_send(skb);
0114 else
0115 kfree_skb(skb);
0116 }
0117
0118 #endif