mars-nwe/doc/old/kpatch1.2.13
2011-11-13 17:37:22 +01:00

123 lines
3.9 KiB
Plaintext

Index: include/linux/ipx.h
--- linux.org/include/linux/ipx.h Mon Feb 6 19:25:22 1995
+++ linux/include/linux/ipx.h Fri Mar 22 00:58:02 1996
@@ -74,5 +74,6 @@
#define SIOCAIPXITFCRT (SIOCPROTOPRIVATE)
#define SIOCAIPXPRISLT (SIOCPROTOPRIVATE+1)
#define SIOCIPXCFGDATA (SIOCPROTOPRIVATE+2)
+#define SIOCIPXNCPCONN (SIOCPROTOPRIVATE+3)
#endif
Index: net/inet/ipx.c
--- linux.org/net/inet/ipx.c Tue Apr 18 21:13:26 1995
+++ linux/net/inet/ipx.c Fri Mar 22 01:25:25 1996
@@ -341,6 +341,20 @@
struct sk_buff *skb1 = NULL, *skb2 = NULL;
int ipx_offset;
+ if (intrfc == ipx_primary_net
+ && ntohs(ipx->ipx_dest.sock) == 0x451
+ && *((char*)(ipx+1)) == 0x22
+ && *((char*)(ipx+1)+1) == 0x22) {
+ int connection = (int) *((char*)(ipx+1)+3);
+ /* 255 connections are enough ;) */
+ if (connection) {
+ for (sock1=intrfc->if_sklist;
+ (sock1 != NULL) &&
+ (sock1->ipx_ncp_conn != connection);
+ sock1=sock1->next);;
+ }
+ }
+ if (sock1 == NULL)
sock1 = ipxitf_find_socket(intrfc, ipx->ipx_dest.sock);
/*
@@ -859,6 +873,7 @@
ipxif=ipxitf_find_using_phys(dev, ipx_map_frame_type(sipx->sipx_type));
if(ipxif==NULL)
return -EADDRNOTAVAIL;
+ sipx->sipx_family=AF_IPX;
sipx->sipx_network=ipxif->if_netnum;
memcpy(sipx->sipx_node, ipxif->if_node, sizeof(sipx->sipx_node));
memcpy_tofs(arg,&ifr,sizeof(ifr));
@@ -909,7 +924,8 @@
return -EAGAIN;
rt->ir_next=ipx_routes;
ipx_routes=rt;
- }
+ } else if (intrfc == ipx_internal_net)
+ return(-EEXIST); /* fix for mars_nwe: 11-Jan-96 */
rt->ir_net = network;
rt->ir_intrfc = intrfc;
@@ -983,6 +999,7 @@
int size;
int ipx_offset;
ipx_route *rt = NULL;
+ int snr;
/* Find the appropriate interface on which to send packet */
if ((usipx->sipx_network == 0L) && (ipx_primary_net != NULL)) {
@@ -1017,9 +1034,14 @@
ipx->ipx_tctrl=0;
ipx->ipx_type=usipx->sipx_type;
skb->h.raw = (unsigned char *)ipx;
-
+ if ((snr=ntohs(sk->ipx_port)) == 0x453 || snr == 0x452) {
+ /* RIP/SAP speicial handling for mars_nwe: 11-Jan-96 */
+ ipx->ipx_source.net = intrfc->if_netnum;
+ memcpy(ipx->ipx_source.node, intrfc->if_node, IPX_NODE_LEN);
+ } else {
ipx->ipx_source.net = sk->ipx_intrfc->if_netnum;
memcpy(ipx->ipx_source.node, sk->ipx_intrfc->if_node, IPX_NODE_LEN);
+ }
ipx->ipx_source.sock = sk->ipx_port;
ipx->ipx_dest.net=usipx->sipx_network;
memcpy(ipx->ipx_dest.node,usipx->sipx_node,IPX_NODE_LEN);
@@ -1335,6 +1357,7 @@
return err;
put_fs_long(sizeof(int),(unsigned long *)optlen);
err=verify_area(VERIFY_WRITE,optval,sizeof(int));
+ if (err) return err;
put_fs_long(val,(unsigned long *)optval);
return(0);
}
@@ -1397,6 +1420,8 @@
sk->debug=0;
sk->ipx_intrfc = NULL;
memset(&sk->ipx_dest_addr,'\0',sizeof(sk->ipx_dest_addr));
+ sk->ipx_ncp_conn = 0; /* no ncp socket yet */
+
sk->ipx_port = 0;
sk->mtu=IPX_MTU;
@@ -1835,6 +1860,16 @@
if(err) return err;
return(ipxcfg_get_config_data((void *)arg));
}
+ case SIOCIPXNCPCONN:
+ {
+ if (!suser()) return(-EPERM);
+ err = verify_area(VERIFY_READ, (void *)arg,
+ sizeof(unsigned short));
+ if (err) return err;
+ sk->ipx_ncp_conn = get_fs_word(arg);
+ return 0;
+ }
+
case SIOCGSTAMP:
if (sk)
{
Index: net/inet/sock.h
Prereq: 1.0.4
--- linux.org/net/inet/sock.h Fri Mar 22 01:11:28 1996
+++ linux/net/inet/sock.h Fri Mar 22 01:12:26 1996
@@ -146,6 +146,7 @@
ipx_interface *ipx_intrfc;
unsigned short ipx_port;
unsigned short ipx_type;
+ unsigned short ipx_ncp_conn;
#endif
#ifdef CONFIG_AX25
/* Really we want to add a per protocol private area */