linux/include/net/ipx.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _NET_INET_IPX_H_
   3#define _NET_INET_IPX_H_
   4/*
   5 *      The following information is in its entirety obtained from:
   6 *
   7 *      Novell 'IPX Router Specification' Version 1.10 
   8 *              Part No. 107-000029-001
   9 *
  10 *      Which is available from ftp.novell.com
  11 */
  12
  13#include <linux/netdevice.h>
  14#include <net/datalink.h>
  15#include <linux/ipx.h>
  16#include <linux/list.h>
  17#include <linux/slab.h>
  18#include <linux/refcount.h>
  19
  20struct ipx_address {
  21        __be32  net;
  22        __u8    node[IPX_NODE_LEN]; 
  23        __be16  sock;
  24};
  25
  26#define ipx_broadcast_node      "\377\377\377\377\377\377"
  27#define ipx_this_node           "\0\0\0\0\0\0"
  28
  29#define IPX_MAX_PPROP_HOPS 8
  30
  31struct ipxhdr {
  32        __be16                  ipx_checksum __packed;
  33#define IPX_NO_CHECKSUM cpu_to_be16(0xFFFF)
  34        __be16                  ipx_pktsize __packed;
  35        __u8                    ipx_tctrl;
  36        __u8                    ipx_type;
  37#define IPX_TYPE_UNKNOWN        0x00
  38#define IPX_TYPE_RIP            0x01    /* may also be 0 */
  39#define IPX_TYPE_SAP            0x04    /* may also be 0 */
  40#define IPX_TYPE_SPX            0x05    /* SPX protocol */
  41#define IPX_TYPE_NCP            0x11    /* $lots for docs on this (SPIT) */
  42#define IPX_TYPE_PPROP          0x14    /* complicated flood fill brdcast */
  43        struct ipx_address      ipx_dest __packed;
  44        struct ipx_address      ipx_source __packed;
  45};
  46
  47/* From af_ipx.c */
  48extern int sysctl_ipx_pprop_broadcasting;
  49
  50static __inline__ struct ipxhdr *ipx_hdr(struct sk_buff *skb)
  51{
  52        return (struct ipxhdr *)skb_transport_header(skb);
  53}
  54
  55struct ipx_interface {
  56        /* IPX address */
  57        __be32                  if_netnum;
  58        unsigned char           if_node[IPX_NODE_LEN];
  59        refcount_t              refcnt;
  60
  61        /* physical device info */
  62        struct net_device       *if_dev;
  63        struct datalink_proto   *if_dlink;
  64        __be16                  if_dlink_type;
  65
  66        /* socket support */
  67        unsigned short          if_sknum;
  68        struct hlist_head       if_sklist;
  69        spinlock_t              if_sklist_lock;
  70
  71        /* administrative overhead */
  72        int                     if_ipx_offset;
  73        unsigned char           if_internal;
  74        unsigned char           if_primary;
  75        
  76        struct list_head        node; /* node in ipx_interfaces list */
  77};
  78
  79struct ipx_route {
  80        __be32                  ir_net;
  81        struct ipx_interface    *ir_intrfc;
  82        unsigned char           ir_routed;
  83        unsigned char           ir_router_node[IPX_NODE_LEN];
  84        struct list_head        node; /* node in ipx_routes list */
  85        refcount_t              refcnt;
  86};
  87
  88struct ipx_cb {
  89        u8      ipx_tctrl;
  90        __be32  ipx_dest_net;
  91        __be32  ipx_source_net;
  92        struct {
  93                __be32 netnum;
  94                int index;
  95        } last_hop;
  96};
  97
  98#include <net/sock.h>
  99
 100struct ipx_sock {
 101        /* struct sock has to be the first member of ipx_sock */
 102        struct sock             sk;
 103        struct ipx_address      dest_addr;
 104        struct ipx_interface    *intrfc;
 105        __be16                  port;
 106#ifdef CONFIG_IPX_INTERN
 107        unsigned char           node[IPX_NODE_LEN];
 108#endif
 109        unsigned short          type;
 110        /*
 111         * To handle special ncp connection-handling sockets for mars_nwe,
 112         * the connection number must be stored in the socket.
 113         */
 114        unsigned short          ipx_ncp_conn;
 115};
 116
 117static inline struct ipx_sock *ipx_sk(struct sock *sk)
 118{
 119        return (struct ipx_sock *)sk;
 120}
 121
 122#define IPX_SKB_CB(__skb) ((struct ipx_cb *)&((__skb)->cb[0]))
 123
 124#define IPX_MIN_EPHEMERAL_SOCKET        0x4000
 125#define IPX_MAX_EPHEMERAL_SOCKET        0x7fff
 126
 127extern struct list_head ipx_routes;
 128extern rwlock_t ipx_routes_lock;
 129
 130extern struct list_head ipx_interfaces;
 131struct ipx_interface *ipx_interfaces_head(void);
 132extern spinlock_t ipx_interfaces_lock;
 133
 134extern struct ipx_interface *ipx_primary_net;
 135
 136int ipx_proc_init(void);
 137void ipx_proc_exit(void);
 138
 139const char *ipx_frame_name(__be16);
 140const char *ipx_device_name(struct ipx_interface *intrfc);
 141
 142static __inline__ void ipxitf_hold(struct ipx_interface *intrfc)
 143{
 144        refcount_inc(&intrfc->refcnt);
 145}
 146
 147void ipxitf_down(struct ipx_interface *intrfc);
 148struct ipx_interface *ipxitf_find_using_net(__be32 net);
 149int ipxitf_send(struct ipx_interface *intrfc, struct sk_buff *skb, char *node);
 150__be16 ipx_cksum(struct ipxhdr *packet, int length);
 151int ipxrtr_add_route(__be32 network, struct ipx_interface *intrfc,
 152                     unsigned char *node);
 153void ipxrtr_del_routes(struct ipx_interface *intrfc);
 154int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,
 155                        struct msghdr *msg, size_t len, int noblock);
 156int ipxrtr_route_skb(struct sk_buff *skb);
 157struct ipx_route *ipxrtr_lookup(__be32 net);
 158int ipxrtr_ioctl(unsigned int cmd, void __user *arg);
 159
 160static __inline__ void ipxitf_put(struct ipx_interface *intrfc)
 161{
 162        if (refcount_dec_and_test(&intrfc->refcnt))
 163                ipxitf_down(intrfc);
 164}
 165
 166static __inline__ void ipxrtr_hold(struct ipx_route *rt)
 167{
 168                refcount_inc(&rt->refcnt);
 169}
 170
 171static __inline__ void ipxrtr_put(struct ipx_route *rt)
 172{
 173                if (refcount_dec_and_test(&rt->refcnt))
 174                                        kfree(rt);
 175}
 176#endif /* _NET_INET_IPX_H_ */
 177