···83struct ipx_interface *ipx_primary_net;84struct ipx_interface *ipx_internal_net;8586-extern int ipxrtr_add_route(__u32 network, struct ipx_interface *intrfc,87 unsigned char *node);88extern void ipxrtr_del_routes(struct ipx_interface *intrfc);89extern int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,90 struct iovec *iov, int len, int noblock);91extern int ipxrtr_route_skb(struct sk_buff *skb);92-extern struct ipx_route *ipxrtr_lookup(__u32 net);93extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg);9495#undef IPX_REFCNT_DEBUG···177}178179static struct ipx_interface *__ipxitf_find_using_phys(struct net_device *dev,180- unsigned short datalink)181{182 struct ipx_interface *i;183···190}191192static struct ipx_interface *ipxitf_find_using_phys(struct net_device *dev,193- unsigned short datalink)194{195 struct ipx_interface *i;196···202 return i;203}204205-struct ipx_interface *ipxitf_find_using_net(__u32 net)206{207 struct ipx_interface *i;208···237238/* caller must hold intrfc->if_sklist_lock */239static struct sock *__ipxitf_find_socket(struct ipx_interface *intrfc,240- unsigned short port)241{242 struct sock *s;243 struct hlist_node *node;···252253/* caller must hold a reference to intrfc */254static struct sock *ipxitf_find_socket(struct ipx_interface *intrfc,255- unsigned short port)256{257 struct sock *s;258···268#ifdef CONFIG_IPX_INTERN269static struct sock *ipxitf_find_internal_socket(struct ipx_interface *intrfc,270 unsigned char *ipx_node,271- unsigned short port)272{273 struct sock *s;274 struct hlist_node *node;···600601 /* see if we need to include the netnum in the route list */602 if (IPX_SKB_CB(skb)->last_hop.index >= 0) {603- u32 *last_hop = (u32 *)(((u8 *) skb->data) +604 sizeof(struct ipxhdr) +605 IPX_SKB_CB(skb)->last_hop.index *606- sizeof(u32));607 *last_hop = IPX_SKB_CB(skb)->last_hop.netnum;608 IPX_SKB_CB(skb)->last_hop.index = -1;609 }···772 } else {773 printk(KERN_WARNING "IPX: Network number collision "774 "%lx\n %s %s and %s %s\n",775- (unsigned long) htonl(cb->ipx_source_net),776 ipx_device_name(i),777 ipx_frame_name(i->if_dlink_type),778 ipx_device_name(intrfc),···812 int i, rc = -EINVAL;813 struct ipx_interface *ifcs;814 char *c;815- u32 *l;816817 /* Illegal packet - too many hops or too short */818 /* We decide to throw it away: no broadcasting, no local processing.···833 goto out;834835 c = ((u8 *) ipx) + sizeof(struct ipxhdr);836- l = (u32 *) c;837838 /* Don't broadcast packet if already seen this net */839 for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++)···855 /* That aren't in the list */856 if (ifcs == intrfc)857 continue;858- l = (__u32 *) c;859 /* don't consider the last entry in the packet list,860 * it is our netnum, and it is not there yet */861 for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++)···885 ipx_primary_net = intrfc;886}887888-static struct ipx_interface *ipxitf_alloc(struct net_device *dev, __u32 netnum,889- unsigned short dlink_type,890 struct datalink_proto *dlink,891 unsigned char internal,892 int ipx_offset)···960static int ipxitf_create(struct ipx_interface_definition *idef)961{962 struct net_device *dev;963- unsigned short dlink_type = 0;964 struct datalink_proto *datalink = NULL;965 struct ipx_interface *intrfc;966 int rc;···1073static int ipxitf_delete(struct ipx_interface_definition *idef)1074{1075 struct net_device *dev = NULL;1076- unsigned short dlink_type = 0;1077 struct ipx_interface *intrfc;1078 int rc = 0;1079···1110}11111112static struct ipx_interface *ipxitf_auto_create(struct net_device *dev,1113- unsigned short dlink_type)1114{1115 struct ipx_interface *intrfc = NULL;1116 struct datalink_proto *datalink;···1122 if (dev->addr_len > IPX_NODE_LEN)1123 goto out;11241125- switch (htons(dlink_type)) {1126 case ETH_P_IPX: datalink = pEII_datalink; break;1127 case ETH_P_802_2: datalink = p8022_datalink; break;1128 case ETH_P_SNAP: datalink = pSNAP_datalink; break;···1266 return ~sum;1267}12681269-const char *ipx_frame_name(unsigned short frame)1270{1271 char* rc = "None";1272···14011402/* caller must hold a reference to intrfc */14031404-static unsigned short ipx_first_free_socketnum(struct ipx_interface *intrfc)1405{1406 unsigned short socketNum = intrfc->if_sknum;1407···1410 if (socketNum < IPX_MIN_EPHEMERAL_SOCKET)1411 socketNum = IPX_MIN_EPHEMERAL_SOCKET;14121413- while (__ipxitf_find_socket(intrfc, ntohs(socketNum)))1414 if (socketNum > IPX_MAX_EPHEMERAL_SOCKET)1415 socketNum = IPX_MIN_EPHEMERAL_SOCKET;1416 else···1419 spin_unlock_bh(&intrfc->if_sklist_lock);1420 intrfc->if_sknum = socketNum;14211422- return ntohs(socketNum);1423}14241425static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)···1473 ipxs->port)) {1474 SOCK_DEBUG(sk,1475 "IPX: bind failed because port %X in use.\n",1476- ntohs((int)addr->sipx_port));1477 goto out_put;1478 }1479 } else {···1488 if (ipxitf_find_socket(intrfc, addr->sipx_port)) {1489 SOCK_DEBUG(sk,1490 "IPX: bind failed because port %X in use.\n",1491- ntohs((int)addr->sipx_port));1492 goto out_put;1493 }1494 }···1665 intrfc = ipxitf_find_using_phys(dev, pt->type);1666 if (!intrfc) {1667 if (ipxcfg_auto_create_interfaces &&1668- ntohl(IPX_SKB_CB(skb)->ipx_dest_net)) {1669 intrfc = ipxitf_auto_create(dev, pt->type);1670 if (intrfc)1671 ipxitf_hold(intrfc);
···83struct ipx_interface *ipx_primary_net;84struct ipx_interface *ipx_internal_net;8586+extern int ipxrtr_add_route(__be32 network, struct ipx_interface *intrfc,87 unsigned char *node);88extern void ipxrtr_del_routes(struct ipx_interface *intrfc);89extern int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,90 struct iovec *iov, int len, int noblock);91extern int ipxrtr_route_skb(struct sk_buff *skb);92+extern struct ipx_route *ipxrtr_lookup(__be32 net);93extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg);9495#undef IPX_REFCNT_DEBUG···177}178179static struct ipx_interface *__ipxitf_find_using_phys(struct net_device *dev,180+ __be16 datalink)181{182 struct ipx_interface *i;183···190}191192static struct ipx_interface *ipxitf_find_using_phys(struct net_device *dev,193+ __be16 datalink)194{195 struct ipx_interface *i;196···202 return i;203}204205+struct ipx_interface *ipxitf_find_using_net(__be32 net)206{207 struct ipx_interface *i;208···237238/* caller must hold intrfc->if_sklist_lock */239static struct sock *__ipxitf_find_socket(struct ipx_interface *intrfc,240+ __be16 port)241{242 struct sock *s;243 struct hlist_node *node;···252253/* caller must hold a reference to intrfc */254static struct sock *ipxitf_find_socket(struct ipx_interface *intrfc,255+ __be16 port)256{257 struct sock *s;258···268#ifdef CONFIG_IPX_INTERN269static struct sock *ipxitf_find_internal_socket(struct ipx_interface *intrfc,270 unsigned char *ipx_node,271+ __be16 port)272{273 struct sock *s;274 struct hlist_node *node;···600601 /* see if we need to include the netnum in the route list */602 if (IPX_SKB_CB(skb)->last_hop.index >= 0) {603+ __be32 *last_hop = (__be32 *)(((u8 *) skb->data) +604 sizeof(struct ipxhdr) +605 IPX_SKB_CB(skb)->last_hop.index *606+ sizeof(__be32));607 *last_hop = IPX_SKB_CB(skb)->last_hop.netnum;608 IPX_SKB_CB(skb)->last_hop.index = -1;609 }···772 } else {773 printk(KERN_WARNING "IPX: Network number collision "774 "%lx\n %s %s and %s %s\n",775+ (unsigned long) ntohl(cb->ipx_source_net),776 ipx_device_name(i),777 ipx_frame_name(i->if_dlink_type),778 ipx_device_name(intrfc),···812 int i, rc = -EINVAL;813 struct ipx_interface *ifcs;814 char *c;815+ __be32 *l;816817 /* Illegal packet - too many hops or too short */818 /* We decide to throw it away: no broadcasting, no local processing.···833 goto out;834835 c = ((u8 *) ipx) + sizeof(struct ipxhdr);836+ l = (__be32 *) c;837838 /* Don't broadcast packet if already seen this net */839 for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++)···855 /* That aren't in the list */856 if (ifcs == intrfc)857 continue;858+ l = (__be32 *) c;859 /* don't consider the last entry in the packet list,860 * it is our netnum, and it is not there yet */861 for (i = 0; i < IPX_SKB_CB(skb)->ipx_tctrl; i++)···885 ipx_primary_net = intrfc;886}887888+static struct ipx_interface *ipxitf_alloc(struct net_device *dev, __be32 netnum,889+ __be16 dlink_type,890 struct datalink_proto *dlink,891 unsigned char internal,892 int ipx_offset)···960static int ipxitf_create(struct ipx_interface_definition *idef)961{962 struct net_device *dev;963+ __be16 dlink_type = 0;964 struct datalink_proto *datalink = NULL;965 struct ipx_interface *intrfc;966 int rc;···1073static int ipxitf_delete(struct ipx_interface_definition *idef)1074{1075 struct net_device *dev = NULL;1076+ __be16 dlink_type = 0;1077 struct ipx_interface *intrfc;1078 int rc = 0;1079···1110}11111112static struct ipx_interface *ipxitf_auto_create(struct net_device *dev,1113+ __be16 dlink_type)1114{1115 struct ipx_interface *intrfc = NULL;1116 struct datalink_proto *datalink;···1122 if (dev->addr_len > IPX_NODE_LEN)1123 goto out;11241125+ switch (ntohs(dlink_type)) {1126 case ETH_P_IPX: datalink = pEII_datalink; break;1127 case ETH_P_802_2: datalink = p8022_datalink; break;1128 case ETH_P_SNAP: datalink = pSNAP_datalink; break;···1266 return ~sum;1267}12681269+const char *ipx_frame_name(__be16 frame)1270{1271 char* rc = "None";1272···14011402/* caller must hold a reference to intrfc */14031404+static __be16 ipx_first_free_socketnum(struct ipx_interface *intrfc)1405{1406 unsigned short socketNum = intrfc->if_sknum;1407···1410 if (socketNum < IPX_MIN_EPHEMERAL_SOCKET)1411 socketNum = IPX_MIN_EPHEMERAL_SOCKET;14121413+ while (__ipxitf_find_socket(intrfc, htons(socketNum)))1414 if (socketNum > IPX_MAX_EPHEMERAL_SOCKET)1415 socketNum = IPX_MIN_EPHEMERAL_SOCKET;1416 else···1419 spin_unlock_bh(&intrfc->if_sklist_lock);1420 intrfc->if_sknum = socketNum;14211422+ return htons(socketNum);1423}14241425static int ipx_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)···1473 ipxs->port)) {1474 SOCK_DEBUG(sk,1475 "IPX: bind failed because port %X in use.\n",1476+ ntohs(addr->sipx_port));1477 goto out_put;1478 }1479 } else {···1488 if (ipxitf_find_socket(intrfc, addr->sipx_port)) {1489 SOCK_DEBUG(sk,1490 "IPX: bind failed because port %X in use.\n",1491+ ntohs(addr->sipx_port));1492 goto out_put;1493 }1494 }···1665 intrfc = ipxitf_find_using_phys(dev, pt->type);1666 if (!intrfc) {1667 if (ipxcfg_auto_create_interfaces &&1668+ IPX_SKB_CB(skb)->ipx_dest_net) {1669 intrfc = ipxitf_auto_create(dev, pt->type);1670 if (intrfc)1671 ipxitf_hold(intrfc);