netatalk and dummy patch for 2.1.29

a sun (asun@zoology.washington.edu)
Wed, 26 Mar 1997 23:49:59 -0800


here's a patch that i've sent to alan that didn't get into 2.1.30. i
thought it might be useful for other people as well. it's to 2.1.29,
but it should work without much difficulty in 2.1.30 as well.

what it does:
1) adds multicast to the dummy module's nefarious
capabilities. i did this so that i could test out appletalk
on my unconnected machine.
2) fixes ddp.c so that you can now kill atalkd and restart it
without problems. it also adds the appropriate module
increment/decrement stuff so that you don't accidentally
free the module while interfaces are still being
used. finally, it plugs a potential low-memory hole in
device creation.

--- linux/drivers/net/dummy.c.save Mon Mar 17 00:25:35 1997
+++ linux/drivers/net/dummy.c Mon Mar 17 00:36:57 1997
@@ -70,6 +70,10 @@
return 0;
}

+/* fake multicast ability */
+static void set_multicast_list(struct device *dev)
+{
+}

int dummy_init(struct device *dev)
{
@@ -90,6 +94,7 @@

dev->open = dummy_open;
dev->stop = dummy_close;
+ dev->set_multicast_list = set_multicast_list;

/* Fill in the fields of the device structure with ethernet-generic values. */
ether_setup(dev);
--- linux/net/appletalk/ddp.c.save Mon Mar 17 01:35:55 1997
+++ linux/net/appletalk/ddp.c Sat Mar 22 14:10:50 1997
@@ -78,6 +78,13 @@
#define DPRINT(x)
#endif

+enum atalk_reserved_ports {
+ RTMP_PORT = 1,
+ NBP_PORT = 2,
+ ECHO_PORT = 4,
+ ZIP_PORT = 6
+};
+
struct datalink_proto *ddp_dl, *aarp_dl;
static struct proto_ops atalk_dgram_ops;

@@ -255,6 +262,7 @@
*iface = tmp->next;
kfree_s(tmp, sizeof(struct atalk_iface));
dev->atalk_ptr=NULL;
+ MOD_DEC_USE_COUNT;
}
else
iface = &tmp->next;
@@ -276,6 +284,7 @@
cli();
iface->next=atalk_iface_list;
atalk_iface_list=iface;
+ MOD_INC_USE_COUNT;
restore_flags(flags);
return iface;
}
@@ -708,6 +717,8 @@
else
{
atif=atif_add_device(dev, &sa->sat_addr);
+ if (atif == NULL)
+ return -ENOMEM;
}
atif->nets= *nr;

@@ -1034,31 +1045,49 @@
if(addr->sat_family!=AF_APPLETALK)
return -EAFNOSUPPORT;

- if(addr->sat_addr.s_net==htons(ATADDR_ANYNET))
- {
- struct at_addr *ap=atalk_find_primary();
- if(ap==NULL)
- return -EADDRNOTAVAIL;
- sk->protinfo.af_at.src_net=addr->sat_addr.s_net=ap->s_net;
- sk->protinfo.af_at.src_node=addr->sat_addr.s_node=ap->s_node;
- }
- else
+ /* special case some of the ports */
+ switch (addr->sat_port)
{
+ case RTMP_PORT:
+ case NBP_PORT:
+ case ECHO_PORT:
+ case ZIP_PORT:
if ( atalk_find_interface( addr->sat_addr.s_net, addr->sat_addr.s_node ) == NULL )
return -EADDRNOTAVAIL;
- sk->protinfo.af_at.src_net=addr->sat_addr.s_net;
- sk->protinfo.af_at.src_node=addr->sat_addr.s_node;
- }
+ sk->protinfo.af_at.src_net = addr->sat_addr.s_net;
+ sk->protinfo.af_at.src_node = addr->sat_addr.s_node;
+ sk->protinfo.af_at.src_port = addr->sat_port;
+ break;

- if(addr->sat_port == ATADDR_ANYPORT)
- {
- int n = atalk_pick_port(addr);
- if(n < 0)
- return n;
- sk->protinfo.af_at.src_port=addr->sat_port=n;
+ default:
+ if(addr->sat_addr.s_net==htons(ATADDR_ANYNET))
+ {
+ struct at_addr *ap=atalk_find_primary();
+ if(ap==NULL)
+ return -EADDRNOTAVAIL;
+ sk->protinfo.af_at.src_net=addr->sat_addr.s_net=ap->s_net;
+ sk->protinfo.af_at.src_node=addr->sat_addr.s_node=ap->s_node;
+ }
+ else
+ {
+ if ( atalk_find_interface( addr->sat_addr.s_net, addr->sat_addr.s_node ) == NULL )
+ return -EADDRNOTAVAIL;
+ sk->protinfo.af_at.src_net=addr->sat_addr.s_net;
+ sk->protinfo.af_at.src_node=addr->sat_addr.s_node;
+ }
+
+ if(addr->sat_port == ATADDR_ANYPORT)
+ {
+ int n = atalk_pick_port(addr);
+ if(n < 0)
+ return n;
+ sk->protinfo.af_at.src_port=addr->sat_port=n;
+ }
+ else
+ sk->protinfo.af_at.src_port=addr->sat_port;
+
+ break;
}
- else
- sk->protinfo.af_at.src_port=addr->sat_port;

if(atalk_find_socket(addr)!=NULL)
return -EADDRINUSE;