parent
41d689b7b6
commit
3a67d2bc37
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=17254
@ -101,6 +101,7 @@ struct iso_ifreq iso_ridreq;
|
||||
struct iso_aliasreq iso_addreq;
|
||||
#endif
|
||||
struct sockaddr_in netmask;
|
||||
struct netrange at_nr; /* AppleTalk net range */
|
||||
|
||||
char name[32];
|
||||
int flags;
|
||||
@ -120,6 +121,7 @@ extern int errno;
|
||||
|
||||
int setifflags(), setifaddr(), setifdstaddr(), setifnetmask();
|
||||
int setifmetric(), setifmtu(), setifbroadaddr(), setifipdst();
|
||||
int setatrange(), setatphase(), checkatrange();
|
||||
int notealias();
|
||||
#ifdef ISO
|
||||
int setsnpaoffset(), setnsellength();
|
||||
@ -150,6 +152,8 @@ struct cmd {
|
||||
{ "-swabips", -EN_SWABIPS, setifflags },
|
||||
#endif
|
||||
{ "netmask", NEXTARG, setifnetmask },
|
||||
{ "range", NEXTARG, setatrange },
|
||||
{ "phase", NEXTARG, setatphase },
|
||||
{ "metric", NEXTARG, setifmetric },
|
||||
{ "broadcast", NEXTARG, setifbroadaddr },
|
||||
{ "ipdst", NEXTARG, setifipdst },
|
||||
@ -203,7 +207,7 @@ struct afswtch {
|
||||
{ "ipx", AF_IPX, ipx_status, ipx_getaddr,
|
||||
SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
|
||||
{ "atalk", AF_APPLETALK, at_status, at_getaddr,
|
||||
SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
|
||||
SIOCDIFADDR, SIOCAIFADDR, C(addreq), C(addreq) },
|
||||
#ifdef NS
|
||||
{ "ns", AF_NS, xns_status, xns_getaddr,
|
||||
SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
|
||||
@ -449,6 +453,8 @@ ifconfig(argc,argv,af,rafp)
|
||||
if (setsockopt(s, 0, SO_IPXIP_ROUTE, &rq, size) < 0)
|
||||
Perror("Encapsulation Routing");
|
||||
}
|
||||
if (af == AF_APPLETALK)
|
||||
checkatrange((struct sockaddr_at *) &addreq.ifra_addr);
|
||||
#ifdef NS
|
||||
if (setipdst && af==AF_NS) {
|
||||
struct nsip_req rq;
|
||||
@ -767,6 +773,7 @@ at_status(force)
|
||||
int force;
|
||||
{
|
||||
struct sockaddr_at *sat, null_sat;
|
||||
struct netrange *nr;
|
||||
|
||||
memset(&null_sat, 0, sizeof(null_sat));
|
||||
|
||||
@ -774,20 +781,28 @@ at_status(force)
|
||||
if (!sat || sat->sat_family != AF_APPLETALK) {
|
||||
if (!force)
|
||||
return;
|
||||
/* warnx("%s has no AF_APPLETALK IFA address!", name); */
|
||||
sat = &null_sat;
|
||||
}
|
||||
printf("\tatalk %d.%d ",
|
||||
ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node);
|
||||
|
||||
nr = (struct netrange *) &sat->sat_zero;
|
||||
printf("\tatalk %d.%d range %d-%d phase %d",
|
||||
ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
|
||||
ntohs(nr->nr_firstnet), ntohs(nr->nr_lastnet), nr->nr_phase);
|
||||
if (flags & IFF_POINTOPOINT) {
|
||||
/* note RTAX_BRD overlap with IFF_BROADCAST */
|
||||
sat = (struct sockaddr_at *)info.rti_info[RTAX_BRD];
|
||||
if (!sat)
|
||||
sat = &null_sat;
|
||||
printf("--> %d.%d ",
|
||||
printf("--> %d.%d",
|
||||
ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node);
|
||||
}
|
||||
if (flags & IFF_BROADCAST) {
|
||||
/* note RTAX_BRD overlap with IFF_POINTOPOINT */
|
||||
sat = (struct sockaddr_at *)info.rti_info[RTAX_BRD];
|
||||
if (sat)
|
||||
printf(" broadcast %d.%d",
|
||||
ntohs(sat->sat_addr.s_net),
|
||||
sat->sat_addr.s_node);
|
||||
}
|
||||
|
||||
putchar('\n');
|
||||
}
|
||||
@ -987,27 +1002,60 @@ char *addr;
|
||||
printf("Attempt to set IPX netmask will be ineffectual\n");
|
||||
}
|
||||
|
||||
#define SATALK(x) ((struct sockaddr_at *) &(x))
|
||||
struct sockaddr_at *atalktab[] = {
|
||||
SATALK(ridreq.ifr_addr), SATALK(addreq.ifra_addr),
|
||||
SATALK(addreq.ifra_mask), SATALK(addreq.ifra_broadaddr)};
|
||||
|
||||
at_getaddr(addr, which)
|
||||
char *addr;
|
||||
at_getaddr(char *addr, int which)
|
||||
{
|
||||
struct sockaddr_at *sat = atalktab[which];
|
||||
struct sockaddr_at *sat = (struct sockaddr_at *) &addreq.ifra_addr;
|
||||
u_int net, node;
|
||||
|
||||
sat->sat_family = AF_IPX;
|
||||
sat->sat_family = AF_APPLETALK;
|
||||
sat->sat_len = sizeof(*sat);
|
||||
if (which == MASK)
|
||||
errx(1, "AppleTalk does not use netmasks\n");
|
||||
if (sscanf(addr, "%u.%u", &net, &node) != 2
|
||||
/* || net == 0 || net > 0xffff || node == 0 || node > 0xfe */ )
|
||||
errx(1, "%s: bad value", addr);
|
||||
|| net == 0 || net > 0xffff || node == 0 || node > 0xfe)
|
||||
errx(1, "%s: illegal address", addr);
|
||||
sat->sat_addr.s_net = htons(net);
|
||||
sat->sat_addr.s_node = node;
|
||||
if (which == MASK)
|
||||
printf("Attempt to set AppleTalk netmask"
|
||||
" will be ineffectual\n");
|
||||
}
|
||||
|
||||
setatrange(char *range)
|
||||
{
|
||||
u_short first = 123, last = 123;
|
||||
|
||||
if (sscanf(range, "%hu-%hu", &first, &last) != 2
|
||||
|| first == 0 || first > 0xffff
|
||||
|| last == 0 || last > 0xffff || first > last)
|
||||
errx(1, "%s: illegal net range: %u-%u", range, first, last);
|
||||
at_nr.nr_firstnet = htons(first);
|
||||
at_nr.nr_lastnet = htons(last);
|
||||
}
|
||||
|
||||
setatphase(char *phase)
|
||||
{
|
||||
if (!strcmp(phase, "1"))
|
||||
at_nr.nr_phase = 1;
|
||||
else if (!strcmp(phase, "2"))
|
||||
at_nr.nr_phase = 2;
|
||||
else
|
||||
errx(1, "%s: illegal phase", phase);
|
||||
}
|
||||
|
||||
checkatrange(struct sockaddr_at *sat)
|
||||
{
|
||||
if (at_nr.nr_phase == 0)
|
||||
at_nr.nr_phase = 2; /* Default phase 2 */
|
||||
if (at_nr.nr_firstnet == 0)
|
||||
at_nr.nr_firstnet = /* Default range of one */
|
||||
at_nr.nr_lastnet = sat->sat_addr.s_net;
|
||||
printf("\tatalk %d.%d range %d-%d phase %d\n",
|
||||
ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
|
||||
ntohs(at_nr.nr_firstnet), ntohs(at_nr.nr_lastnet), at_nr.nr_phase);
|
||||
if ((u_short) ntohs(at_nr.nr_firstnet) >
|
||||
(u_short) ntohs(sat->sat_addr.s_net)
|
||||
|| (u_short) ntohs(at_nr.nr_lastnet) <
|
||||
(u_short) ntohs(sat->sat_addr.s_net))
|
||||
errx(1, "AppleTalk address is not in range");
|
||||
*((struct netrange *) &sat->sat_zero) = at_nr;
|
||||
}
|
||||
|
||||
#ifdef NS
|
||||
|
@ -43,7 +43,7 @@ static const char copyright[] =
|
||||
static char sccsid[] = "@(#)route.c 8.3 (Berkeley) 3/19/94";
|
||||
*/
|
||||
static const char rcsid[] =
|
||||
"$Id: route.c,v 1.8 1996/05/08 20:48:59 wollman Exp $";
|
||||
"$Id: route.c,v 1.9 1996/07/09 19:02:28 julian Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -1513,7 +1513,7 @@ atalk_aton(const char *text, struct at_addr *addr)
|
||||
if (sscanf(text, "%u.%u", &net, &node) != 2
|
||||
|| net > 0xffff || node > 0xff)
|
||||
return(0);
|
||||
addr->s_net = net;
|
||||
addr->s_net = htons(net);
|
||||
addr->s_node = node;
|
||||
return(1);
|
||||
}
|
||||
@ -1523,6 +1523,6 @@ atalk_ntoa(struct at_addr at)
|
||||
{
|
||||
static char buf[20];
|
||||
|
||||
(void) snprintf(buf, sizeof(buf), "%u.%u", at.s_net, at.s_node);
|
||||
(void) snprintf(buf, sizeof(buf), "%u.%u", ntohs(at.s_net), at.s_node);
|
||||
return(buf);
|
||||
}
|
||||
|
@ -8,30 +8,17 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/param.h>
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <machine/endian.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#endif
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/time.h>
|
||||
#ifndef _IBMR2
|
||||
#include <sys/kernel.h>
|
||||
#endif _IBMR2
|
||||
#include <net/if.h>
|
||||
#include <net/route.h>
|
||||
#if !defined( __FreeBSD__ )
|
||||
#include <net/af.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#undef s_net
|
||||
#include <netinet/if_ether.h>
|
||||
#ifdef _IBMR2
|
||||
#include <netinet/in_netarp.h>
|
||||
#include <net/spl.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/err_rec.h>
|
||||
#endif _IBMR2
|
||||
|
||||
#include <netatalk/at.h>
|
||||
#include <netatalk/at_var.h>
|
||||
@ -43,13 +30,8 @@
|
||||
static void aarptfree( struct aarptab *aat);
|
||||
static void at_aarpinput( struct arpcom *ac, struct mbuf *m);
|
||||
|
||||
#ifdef GATEWAY
|
||||
#define AARPTAB_BSIZ 16
|
||||
#define AARPTAB_NB 37
|
||||
#else
|
||||
#define AARPTAB_BSIZ 9
|
||||
#define AARPTAB_NB 19
|
||||
#endif GATEWAY
|
||||
#define AARPTAB_SIZE (AARPTAB_BSIZ * AARPTAB_NB)
|
||||
struct aarptab aarptab[AARPTAB_SIZE];
|
||||
int aarptab_size = AARPTAB_SIZE;
|
||||
@ -72,13 +54,9 @@ int aarptab_size = AARPTAB_SIZE;
|
||||
#define AARPT_KILLC 20
|
||||
#define AARPT_KILLI 3
|
||||
|
||||
#ifdef sun
|
||||
extern struct ether_addr etherbroadcastaddr;
|
||||
#else sun
|
||||
# if !defined( __FreeBSD__ )
|
||||
extern u_char etherbroadcastaddr[6];
|
||||
# endif __FreeBSD__
|
||||
#endif sun
|
||||
|
||||
u_char atmulticastaddr[ 6 ] = {
|
||||
0x09, 0x00, 0x07, 0xff, 0xff, 0xff,
|
||||
@ -116,10 +94,8 @@ at_ifawithnet( sat, ifa )
|
||||
struct sockaddr_at *sat;
|
||||
struct ifaddr *ifa;
|
||||
{
|
||||
struct at_ifaddr *aa;
|
||||
|
||||
for (; ifa; ifa = ifa->ifa_next ) {
|
||||
#ifdef BSD4_4
|
||||
if ( ifa->ifa_addr->sa_family != AF_APPLETALK ) {
|
||||
continue;
|
||||
}
|
||||
@ -127,16 +103,6 @@ at_ifawithnet( sat, ifa )
|
||||
sat->sat_addr.s_net ) {
|
||||
break;
|
||||
}
|
||||
#else BSD4_4
|
||||
if ( ifa->ifa_addr.sa_family != AF_APPLETALK ) {
|
||||
continue;
|
||||
}
|
||||
aa = (struct at_ifaddr *)ifa;
|
||||
if ( ntohs( sat->sat_addr.s_net ) >= ntohs( aa->aa_firstnet ) &&
|
||||
ntohs( sat->sat_addr.s_net ) <= ntohs( aa->aa_lastnet )) {
|
||||
break;
|
||||
}
|
||||
#endif BSD4_4
|
||||
}
|
||||
return( ifa );
|
||||
}
|
||||
@ -151,20 +117,12 @@ aarpwhohas( struct arpcom *ac, struct sockaddr_at *sat )
|
||||
struct llc *llc;
|
||||
struct sockaddr sa;
|
||||
|
||||
#ifdef BSD4_4
|
||||
if (( m = m_gethdr( M_DONTWAIT, MT_DATA )) == NULL ) {
|
||||
return;
|
||||
}
|
||||
m->m_len = sizeof( *ea );
|
||||
m->m_pkthdr.len = sizeof( *ea );
|
||||
MH_ALIGN( m, sizeof( *ea ));
|
||||
#else BSD4_4
|
||||
if (( m = m_get( M_DONTWAIT, MT_DATA )) == NULL ) {
|
||||
return;
|
||||
}
|
||||
m->m_len = sizeof( *ea );
|
||||
m->m_off = MMAXOFF - sizeof( *ea );
|
||||
#endif BSD4_4
|
||||
|
||||
ea = mtod( m, struct ether_aarp *);
|
||||
bzero((caddr_t)ea, sizeof( *ea ));
|
||||
@ -174,13 +132,8 @@ aarpwhohas( struct arpcom *ac, struct sockaddr_at *sat )
|
||||
ea->aarp_hln = sizeof( ea->aarp_sha );
|
||||
ea->aarp_pln = sizeof( ea->aarp_spu );
|
||||
ea->aarp_op = htons( AARPOP_REQUEST );
|
||||
#ifdef sun
|
||||
bcopy((caddr_t)&ac->ac_enaddr, (caddr_t)ea->aarp_sha,
|
||||
sizeof( ea->aarp_sha ));
|
||||
#else sun
|
||||
bcopy((caddr_t)ac->ac_enaddr, (caddr_t)ea->aarp_sha,
|
||||
sizeof( ea->aarp_sha ));
|
||||
#endif sun
|
||||
|
||||
/*
|
||||
* We need to check whether the output ethernet type should
|
||||
@ -198,24 +151,10 @@ aarpwhohas( struct arpcom *ac, struct sockaddr_at *sat )
|
||||
eh = (struct ether_header *)sa.sa_data;
|
||||
|
||||
if ( aa->aa_flags & AFA_PHASE2 ) {
|
||||
#ifdef sun
|
||||
bcopy((caddr_t)atmulticastaddr, (caddr_t)&eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#else sun
|
||||
bcopy((caddr_t)atmulticastaddr, (caddr_t)eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#endif sun
|
||||
#if defined(sun) && defined(i386)
|
||||
eh->ether_type = htons(sizeof(struct llc) + sizeof(struct ether_aarp));
|
||||
#else
|
||||
eh->ether_type = sizeof(struct llc) + sizeof(struct ether_aarp);
|
||||
#endif
|
||||
#ifdef BSD4_4
|
||||
M_PREPEND( m, sizeof( struct llc ), M_WAIT );
|
||||
#else BSD4_4
|
||||
m->m_len += sizeof( struct llc );
|
||||
m->m_off -= sizeof( struct llc );
|
||||
#endif BSD4_4
|
||||
llc = mtod( m, struct llc *);
|
||||
llc->llc_dsap = llc->llc_ssap = LLC_SNAP_LSAP;
|
||||
llc->llc_control = LLC_UI;
|
||||
@ -229,18 +168,9 @@ aarpwhohas( struct arpcom *ac, struct sockaddr_at *sat )
|
||||
ea->aarp_spnode = AA_SAT( aa )->sat_addr.s_node;
|
||||
ea->aarp_tpnode = sat->sat_addr.s_node;
|
||||
} else {
|
||||
#ifdef sun
|
||||
bcopy((caddr_t)ðerbroadcastaddr, (caddr_t)&eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#else sun
|
||||
bcopy((caddr_t)etherbroadcastaddr, (caddr_t)eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#endif sun
|
||||
#if defined(sun) && defined(i386)
|
||||
eh->ether_type = htons( ETHERTYPE_AARP );
|
||||
#else
|
||||
eh->ether_type = ETHERTYPE_AARP;
|
||||
#endif
|
||||
|
||||
ea->aarp_spa = AA_SAT( aa )->sat_addr.s_node;
|
||||
ea->aarp_tpa = sat->sat_addr.s_node;
|
||||
@ -252,15 +182,10 @@ aarpwhohas( struct arpcom *ac, struct sockaddr_at *sat )
|
||||
AA_SAT( aa )->sat_addr.s_node);
|
||||
#endif NETATALKDEBUG
|
||||
|
||||
#ifdef BSD4_4
|
||||
sa.sa_len = sizeof( struct sockaddr );
|
||||
#endif BSD4_4
|
||||
sa.sa_family = AF_UNSPEC;
|
||||
(*ac->ac_if.if_output)(&ac->ac_if, m, &sa
|
||||
#if defined( __FreeBSD__ )
|
||||
, NULL /* XXX should be routing information */
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
(*ac->ac_if.if_output)(&ac->ac_if,
|
||||
m, &sa, NULL); /* XXX NULL should be routing information */
|
||||
}
|
||||
|
||||
int
|
||||
@ -268,14 +193,9 @@ aarpresolve( ac, m, destsat, desten )
|
||||
struct arpcom *ac;
|
||||
struct mbuf *m;
|
||||
struct sockaddr_at *destsat;
|
||||
#ifdef sun
|
||||
struct ether_addr *desten;
|
||||
#else sun
|
||||
u_char *desten;
|
||||
#endif sun
|
||||
{
|
||||
struct at_ifaddr *aa;
|
||||
struct ifaddr ifa;
|
||||
struct aarptab *aat;
|
||||
int s;
|
||||
|
||||
@ -289,13 +209,8 @@ aarpresolve( ac, m, destsat, desten )
|
||||
bcopy( (caddr_t)atmulticastaddr, (caddr_t)desten,
|
||||
sizeof( atmulticastaddr ));
|
||||
} else {
|
||||
#ifdef sun
|
||||
bcopy( (caddr_t)ðerbroadcastaddr, (caddr_t)desten,
|
||||
sizeof( etherbroadcastaddr ));
|
||||
#else sun
|
||||
bcopy( (caddr_t)etherbroadcastaddr, (caddr_t)desten,
|
||||
sizeof( etherbroadcastaddr ));
|
||||
#endif sun
|
||||
}
|
||||
return( 1 );
|
||||
}
|
||||
@ -340,10 +255,6 @@ aarpinput( ac, m )
|
||||
if ( ac->ac_if.if_flags & IFF_NOARP )
|
||||
goto out;
|
||||
|
||||
#ifndef BSD4_4
|
||||
IF_ADJ( m );
|
||||
#endif BSD4_4
|
||||
|
||||
if ( m->m_len < sizeof( struct arphdr )) {
|
||||
goto out;
|
||||
}
|
||||
@ -374,7 +285,6 @@ aarpinput( ac, m )
|
||||
static void
|
||||
at_aarpinput( struct arpcom *ac, struct mbuf *m)
|
||||
{
|
||||
struct mbuf *m0;
|
||||
struct ether_aarp *ea;
|
||||
struct at_ifaddr *aa;
|
||||
struct aarptab *aat;
|
||||
@ -383,33 +293,23 @@ at_aarpinput( struct arpcom *ac, struct mbuf *m)
|
||||
struct sockaddr_at sat;
|
||||
struct sockaddr sa;
|
||||
struct at_addr spa, tpa, ma;
|
||||
int op, s;
|
||||
int op;
|
||||
u_short net;
|
||||
|
||||
ea = mtod( m, struct ether_aarp *);
|
||||
|
||||
/* Check to see if from my hardware address */
|
||||
#ifdef sun
|
||||
if ( !bcmp(( caddr_t )ea->aarp_sha, ( caddr_t )&ac->ac_enaddr,
|
||||
sizeof( ac->ac_enaddr ))) {
|
||||
m_freem( m );
|
||||
return;
|
||||
}
|
||||
#else sun
|
||||
if ( !bcmp(( caddr_t )ea->aarp_sha, ( caddr_t )ac->ac_enaddr,
|
||||
sizeof( ac->ac_enaddr ))) {
|
||||
m_freem( m );
|
||||
return;
|
||||
}
|
||||
#endif sun
|
||||
|
||||
op = ntohs( ea->aarp_op );
|
||||
bcopy( ea->aarp_tpnet, &net, sizeof( net ));
|
||||
|
||||
if ( net != 0 ) { /* should be ATADDR_ANYNET? */
|
||||
#ifdef BSD4_4
|
||||
sat.sat_len = sizeof(struct sockaddr_at);
|
||||
#endif BSD4_4
|
||||
sat.sat_family = AF_APPLETALK;
|
||||
sat.sat_addr.s_net = net;
|
||||
if (( aa = (struct at_ifaddr *)at_ifawithnet( &sat,
|
||||
@ -463,16 +363,10 @@ at_aarpinput( struct arpcom *ac, struct mbuf *m)
|
||||
* that someone's saying they have the same source address
|
||||
* as the one we're using. Get upset...
|
||||
*/
|
||||
#ifndef _IBMR2
|
||||
#ifdef ultrix
|
||||
mprintf( LOG_ERR,
|
||||
#else ultrix
|
||||
log( LOG_ERR,
|
||||
#endif ultrix
|
||||
"aarp: duplicate AT address!! %x:%x:%x:%x:%x:%x\n",
|
||||
ea->aarp_sha[ 0 ], ea->aarp_sha[ 1 ], ea->aarp_sha[ 2 ],
|
||||
ea->aarp_sha[ 3 ], ea->aarp_sha[ 4 ], ea->aarp_sha[ 5 ]);
|
||||
#endif _IBMR2
|
||||
m_freem( m );
|
||||
return;
|
||||
}
|
||||
@ -495,32 +389,11 @@ at_aarpinput( struct arpcom *ac, struct mbuf *m)
|
||||
sizeof( ea->aarp_sha ));
|
||||
aat->aat_flags |= ATF_COM;
|
||||
if ( aat->aat_hold ) {
|
||||
#ifdef _IBMR2
|
||||
/*
|
||||
* Like in ddp_output(), we can't rely on the if_output
|
||||
* routine to resolve AF_APPLETALK addresses, on the rs6k.
|
||||
* So, we fill the destination ethernet address here.
|
||||
*
|
||||
* This should really be replaced with something like
|
||||
* rsif_output(). XXX Will have to be for phase 2.
|
||||
*/
|
||||
/* XXX maybe fill in the rest of the frame header */
|
||||
sat.sat_family = AF_UNSPEC;
|
||||
bcopy( aat->aat_enaddr, (*(struct sockaddr *)&sat).sa_data,
|
||||
sizeof( aat->aat_enaddr ));
|
||||
#else _IBMR2
|
||||
#ifdef BSD4_4
|
||||
sat.sat_len = sizeof(struct sockaddr_at);
|
||||
#endif BSD4_4
|
||||
sat.sat_family = AF_APPLETALK;
|
||||
sat.sat_addr = spa;
|
||||
#endif _IBMR2
|
||||
(*ac->ac_if.if_output)( &ac->ac_if, aat->aat_hold,
|
||||
(struct sockaddr *)&sat
|
||||
#if defined( __FreeBSD__ )
|
||||
, NULL /* XXX */
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
(struct sockaddr *)&sat, NULL); /* XXX */
|
||||
aat->aat_hold = 0;
|
||||
}
|
||||
}
|
||||
@ -546,47 +419,21 @@ at_aarpinput( struct arpcom *ac, struct mbuf *m)
|
||||
|
||||
bcopy(( caddr_t )ea->aarp_sha, ( caddr_t )ea->aarp_tha,
|
||||
sizeof( ea->aarp_sha ));
|
||||
#ifdef sun
|
||||
bcopy(( caddr_t )&ac->ac_enaddr, ( caddr_t )ea->aarp_sha,
|
||||
sizeof( ea->aarp_sha ));
|
||||
#else sun
|
||||
bcopy(( caddr_t )ac->ac_enaddr, ( caddr_t )ea->aarp_sha,
|
||||
sizeof( ea->aarp_sha ));
|
||||
#endif sun
|
||||
|
||||
/* XXX */
|
||||
eh = (struct ether_header *)sa.sa_data;
|
||||
#ifdef sun
|
||||
bcopy(( caddr_t )ea->aarp_tha, ( caddr_t )&eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#else sun
|
||||
bcopy(( caddr_t )ea->aarp_tha, ( caddr_t )eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#endif sun
|
||||
|
||||
if ( aa->aa_flags & AFA_PHASE2 ) {
|
||||
#if defined(sun) && defined(i386)
|
||||
eh->ether_type = htons( sizeof( struct llc ) +
|
||||
sizeof( struct ether_aarp ));
|
||||
#else
|
||||
eh->ether_type = sizeof( struct llc ) + sizeof( struct ether_aarp );
|
||||
#endif
|
||||
#ifdef BSD4_4
|
||||
M_PREPEND( m, sizeof( struct llc ), M_DONTWAIT );
|
||||
if ( m == NULL ) {
|
||||
return;
|
||||
}
|
||||
#else BSD4_4
|
||||
MGET( m0, M_DONTWAIT, MT_HEADER );
|
||||
if ( m0 == NULL ) {
|
||||
m_freem( m );
|
||||
return;
|
||||
}
|
||||
m0->m_next = m;
|
||||
m = m0;
|
||||
m->m_off = MMAXOFF - sizeof( struct llc );
|
||||
m->m_len = sizeof ( struct llc );
|
||||
#endif BSD4_4
|
||||
llc = mtod( m, struct llc *);
|
||||
llc->llc_dsap = llc->llc_ssap = LLC_SNAP_LSAP;
|
||||
llc->llc_control = LLC_UI;
|
||||
@ -596,26 +443,16 @@ at_aarpinput( struct arpcom *ac, struct mbuf *m)
|
||||
bcopy( ea->aarp_spnet, ea->aarp_tpnet, sizeof( ea->aarp_tpnet ));
|
||||
bcopy( &ma.s_net, ea->aarp_spnet, sizeof( ea->aarp_spnet ));
|
||||
} else {
|
||||
#if defined(sun) && defined(i386)
|
||||
eh->ether_type = htons( ETHERTYPE_AARP );
|
||||
#else
|
||||
eh->ether_type = ETHERTYPE_AARP;
|
||||
#endif
|
||||
}
|
||||
|
||||
ea->aarp_tpnode = ea->aarp_spnode;
|
||||
ea->aarp_spnode = ma.s_node;
|
||||
ea->aarp_op = htons( AARPOP_RESPONSE );
|
||||
|
||||
#ifdef BSD4_4
|
||||
sa.sa_len = sizeof( struct sockaddr );
|
||||
#endif BSD4_4
|
||||
sa.sa_family = AF_UNSPEC;
|
||||
(*ac->ac_if.if_output)( &ac->ac_if, m, &sa
|
||||
#if defined( __FreeBSD__ )
|
||||
, NULL /* XXX */
|
||||
#endif
|
||||
);
|
||||
(*ac->ac_if.if_output)( &ac->ac_if, m, &sa, NULL); /* XXX */
|
||||
return;
|
||||
}
|
||||
|
||||
@ -703,20 +540,12 @@ aarpprobe( struct arpcom *ac )
|
||||
timeout( (timeout_func_t)aarpprobe, (caddr_t)ac, hz / 5 );
|
||||
}
|
||||
|
||||
#ifdef BSD4_4
|
||||
if (( m = m_gethdr( M_DONTWAIT, MT_DATA )) == NULL ) {
|
||||
return;
|
||||
}
|
||||
m->m_len = sizeof( *ea );
|
||||
m->m_pkthdr.len = sizeof( *ea );
|
||||
MH_ALIGN( m, sizeof( *ea ));
|
||||
#else BSD4_4
|
||||
if (( m = m_get( M_DONTWAIT, MT_DATA )) == NULL ) {
|
||||
return;
|
||||
}
|
||||
m->m_len = sizeof( *ea );
|
||||
m->m_off = MMAXOFF - sizeof( *ea );
|
||||
#endif BSD4_4
|
||||
|
||||
ea = mtod( m, struct ether_aarp *);
|
||||
bzero((caddr_t)ea, sizeof( *ea ));
|
||||
@ -726,36 +555,17 @@ aarpprobe( struct arpcom *ac )
|
||||
ea->aarp_hln = sizeof( ea->aarp_sha );
|
||||
ea->aarp_pln = sizeof( ea->aarp_spu );
|
||||
ea->aarp_op = htons( AARPOP_PROBE );
|
||||
#ifdef sun
|
||||
bcopy((caddr_t)&ac->ac_enaddr, (caddr_t)ea->aarp_sha,
|
||||
sizeof( ea->aarp_sha ));
|
||||
#else sun
|
||||
bcopy((caddr_t)ac->ac_enaddr, (caddr_t)ea->aarp_sha,
|
||||
sizeof( ea->aarp_sha ));
|
||||
#endif sun
|
||||
|
||||
eh = (struct ether_header *)sa.sa_data;
|
||||
|
||||
if ( aa->aa_flags & AFA_PHASE2 ) {
|
||||
#ifdef sun
|
||||
bcopy((caddr_t)atmulticastaddr, (caddr_t)&eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#else sun
|
||||
bcopy((caddr_t)atmulticastaddr, (caddr_t)eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#endif sun
|
||||
#if defined(sun) && defined(i386)
|
||||
eh->ether_type = htons( sizeof( struct llc ) +
|
||||
sizeof( struct ether_aarp ));
|
||||
#else
|
||||
eh->ether_type = sizeof( struct llc ) + sizeof( struct ether_aarp );
|
||||
#endif
|
||||
#ifdef BSD4_4
|
||||
M_PREPEND( m, sizeof( struct llc ), M_WAIT );
|
||||
#else BSD4_4
|
||||
m->m_len += sizeof( struct llc );
|
||||
m->m_off -= sizeof( struct llc );
|
||||
#endif BSD4_4
|
||||
llc = mtod( m, struct llc *);
|
||||
llc->llc_dsap = llc->llc_ssap = LLC_SNAP_LSAP;
|
||||
llc->llc_control = LLC_UI;
|
||||
@ -768,18 +578,9 @@ aarpprobe( struct arpcom *ac )
|
||||
sizeof( ea->aarp_tpnet ));
|
||||
ea->aarp_spnode = ea->aarp_tpnode = AA_SAT( aa )->sat_addr.s_node;
|
||||
} else {
|
||||
#ifdef sun
|
||||
bcopy((caddr_t)ðerbroadcastaddr, (caddr_t)&eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#else sun
|
||||
bcopy((caddr_t)etherbroadcastaddr, (caddr_t)eh->ether_dhost,
|
||||
sizeof( eh->ether_dhost ));
|
||||
#endif sun
|
||||
#if defined(sun) && defined(i386)
|
||||
eh->ether_type = htons( ETHERTYPE_AARP );
|
||||
#else
|
||||
eh->ether_type = ETHERTYPE_AARP;
|
||||
#endif
|
||||
ea->aarp_spa = ea->aarp_tpa = AA_SAT( aa )->sat_addr.s_node;
|
||||
}
|
||||
|
||||
@ -789,15 +590,9 @@ aarpprobe( struct arpcom *ac )
|
||||
AA_SAT( aa )->sat_addr.s_node);
|
||||
#endif NETATALKDEBUG
|
||||
|
||||
#ifdef BSD4_4
|
||||
sa.sa_len = sizeof( struct sockaddr );
|
||||
#endif BSD4_4
|
||||
sa.sa_family = AF_UNSPEC;
|
||||
(*ac->ac_if.if_output)(&ac->ac_if, m, &sa
|
||||
#if defined( __FreeBSD__ )
|
||||
, NULL /* XXX */
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
(*ac->ac_if.if_output)(&ac->ac_if, m, &sa, NULL); /* XXX */
|
||||
aa->aa_probcnt--;
|
||||
}
|
||||
|
||||
|
@ -55,8 +55,6 @@ struct aarptab {
|
||||
|
||||
#ifdef KERNEL
|
||||
struct aarptab *aarptnew(struct at_addr *);
|
||||
#if !defined( __FreeBSD__ )
|
||||
int aarpprobe();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* _NETATALK_AARP_H_ */
|
||||
|
@ -58,11 +58,7 @@ struct at_addr {
|
||||
u_char s_node;
|
||||
};
|
||||
|
||||
#if defined( BSD4_4 ) && !defined( __FreeBSD__ )
|
||||
#define ATADDR_ANYNET (u_short)0xffff
|
||||
#else
|
||||
#define ATADDR_ANYNET (u_short)0x0000
|
||||
#endif
|
||||
#define ATADDR_ANYNODE (u_char)0x00
|
||||
#define ATADDR_ANYPORT (u_char)0x00
|
||||
#define ATADDR_BCAST (u_char)0xff /* There is no BCAST for NET */
|
||||
@ -75,32 +71,11 @@ struct at_addr {
|
||||
* by the kernel.
|
||||
*/
|
||||
struct sockaddr_at {
|
||||
#ifdef BSD4_4
|
||||
u_char sat_len;
|
||||
u_char sat_family;
|
||||
#else BSD4_4
|
||||
short sat_family;
|
||||
#endif BSD4_4
|
||||
u_char sat_port;
|
||||
struct at_addr sat_addr;
|
||||
#ifdef notdef
|
||||
struct {
|
||||
u_char sh_type;
|
||||
# define SATHINT_NONE 0
|
||||
# define SATHINT_CONFIG 1
|
||||
# define SATHINT_IFACE 2
|
||||
union {
|
||||
char su_zero[ 7 ]; /* XXX check size */
|
||||
struct {
|
||||
u_char sr_phase;
|
||||
u_short sr_firstnet, sr_lastnet;
|
||||
} su_range;
|
||||
u_short su_interface;
|
||||
} sh_un;
|
||||
} sat_hints;
|
||||
#else notdef
|
||||
char sat_zero[ 8 ];
|
||||
#endif notdef
|
||||
char sat_zero[ 8 ]; /* Hide a struct netrange in here */
|
||||
};
|
||||
|
||||
struct netrange {
|
||||
|
@ -5,31 +5,19 @@
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#ifdef ibm032
|
||||
#include <sys/dir.h>
|
||||
#endif ibm032
|
||||
#include <sys/proc.h>
|
||||
#ifndef BSD4_4
|
||||
#include <sys/user.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mbuf.h>
|
||||
#ifndef _IBMR2
|
||||
#include <sys/kernel.h>
|
||||
#endif _IBMR2
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
#include <net/if.h>
|
||||
/* #include <net/af.h> */
|
||||
#include <net/route.h>
|
||||
#include <netinet/in.h>
|
||||
#undef s_net
|
||||
#include <netinet/if_ether.h>
|
||||
#ifdef _IBMR2
|
||||
#include <net/spl.h>
|
||||
#endif _IBMR2
|
||||
|
||||
#include "at.h"
|
||||
#include "at_var.h"
|
||||
@ -37,47 +25,21 @@
|
||||
#include "phase2.h"
|
||||
#include <netatalk/at_extern.h>
|
||||
|
||||
static int aa_addrangeroute(struct ifaddr *ifa, int first, int last);
|
||||
static int aa_addsingleroute(struct ifaddr *ifa,
|
||||
struct at_addr *addr, struct at_addr *mask);
|
||||
static int aa_delsingleroute(struct ifaddr *ifa,
|
||||
struct at_addr *addr, struct at_addr *mask);
|
||||
static int aa_dosingleroute(struct ifaddr *ifa, struct at_addr *addr,
|
||||
struct at_addr *mask, int cmd, int flags);
|
||||
static int at_scrub( struct ifnet *ifp, struct at_ifaddr *aa );
|
||||
static int at_ifinit( struct ifnet *ifp, struct at_ifaddr *aa,
|
||||
struct sockaddr_at *sat );
|
||||
|
||||
#ifdef BSD4_4
|
||||
# define sateqaddr(a,b) ((a)->sat_len == (b)->sat_len && \
|
||||
(a)->sat_family == (b)->sat_family && \
|
||||
(a)->sat_addr.s_net == (b)->sat_addr.s_net && \
|
||||
(a)->sat_addr.s_node == (b)->sat_addr.s_node )
|
||||
#else BSD4_4
|
||||
atalk_hash( sat, hp )
|
||||
struct sockaddr_at *sat;
|
||||
struct afhash *hp;
|
||||
{
|
||||
hp->afh_nethash = sat->sat_addr.s_net;
|
||||
hp->afh_hosthash = ( sat->sat_addr.s_net << 8 ) +
|
||||
sat->sat_addr.s_node;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note the magic to get ifa_ifwithnet() to work without adding an
|
||||
* ifaddr entry for each net in our local range.
|
||||
*/
|
||||
int
|
||||
atalk_netmatch( sat1, sat2 )
|
||||
struct sockaddr_at *sat1, *sat2;
|
||||
{
|
||||
struct at_ifaddr *aa;
|
||||
|
||||
for ( aa = at_ifaddr; aa; aa = aa->aa_next ) {
|
||||
if ( AA_SAT( aa ) == sat1 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( aa ) {
|
||||
return( ntohs( aa->aa_firstnet ) <= ntohs( sat2->sat_addr.s_net ) &&
|
||||
ntohs( aa->aa_lastnet ) >= ntohs( sat2->sat_addr.s_net ));
|
||||
}
|
||||
return( sat1->sat_addr.s_net == sat2->sat_addr.s_net );
|
||||
}
|
||||
#endif BSD4_4
|
||||
|
||||
int
|
||||
at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
@ -85,10 +47,8 @@ at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
struct ifreq *ifr = (struct ifreq *)data;
|
||||
struct sockaddr_at *sat;
|
||||
struct netrange *nr;
|
||||
#ifdef BSD4_4
|
||||
struct at_aliasreq *ifra = (struct at_aliasreq *)data;
|
||||
struct at_ifaddr *aa0;
|
||||
#endif BSD4_4
|
||||
struct at_ifaddr *aa = 0;
|
||||
struct mbuf *m;
|
||||
struct ifaddr *ifa;
|
||||
@ -100,7 +60,6 @@ at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
}
|
||||
|
||||
switch ( cmd ) {
|
||||
#ifdef BSD4_4
|
||||
case SIOCAIFADDR:
|
||||
case SIOCDIFADDR:
|
||||
if ( ifra->ifra_addr.sat_family == AF_APPLETALK ) {
|
||||
@ -115,26 +74,11 @@ at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
return( EADDRNOTAVAIL );
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
#endif BSD4_4
|
||||
|
||||
case SIOCSIFADDR:
|
||||
#ifdef BSD4_4
|
||||
/*
|
||||
* What a great idea this is: Let's reverse the meaning of
|
||||
* the return...
|
||||
*/
|
||||
#if defined( __FreeBSD__ )
|
||||
if ( suser(p->p_ucred, &p->p_acflag) ) {
|
||||
#else
|
||||
if ( suser( u.u_cred, &u.u_acflag )) {
|
||||
#endif
|
||||
return( EPERM );
|
||||
}
|
||||
#else BSD4_4
|
||||
if ( !suser()) {
|
||||
return( EPERM );
|
||||
}
|
||||
#endif BSD4_4
|
||||
|
||||
sat = satosat( &ifr->ifr_addr );
|
||||
nr = (struct netrange *)sat->sat_zero;
|
||||
@ -191,11 +135,9 @@ at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
ifp->if_addrlist = (struct ifaddr *)aa;
|
||||
}
|
||||
|
||||
#ifdef BSD4_4
|
||||
aa->aa_ifa.ifa_addr = (struct sockaddr *)&aa->aa_addr;
|
||||
aa->aa_ifa.ifa_dstaddr = (struct sockaddr *)&aa->aa_addr;
|
||||
aa->aa_ifa.ifa_netmask = (struct sockaddr *)&aa->aa_netmask;
|
||||
#endif BSD4_4
|
||||
|
||||
/*
|
||||
* Set/clear the phase 2 bit.
|
||||
@ -236,17 +178,17 @@ at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
|
||||
switch ( cmd ) {
|
||||
case SIOCGIFADDR:
|
||||
#ifdef BSD4_4
|
||||
*(struct sockaddr_at *)&ifr->ifr_addr = aa->aa_addr;
|
||||
#else BSD4_4
|
||||
ifr->ifr_addr = aa->aa_addr;
|
||||
#endif BSD4_4
|
||||
sat = (struct sockaddr_at *)&ifr->ifr_addr;
|
||||
*sat = aa->aa_addr;
|
||||
((struct netrange *)&sat->sat_zero)->nr_phase
|
||||
= (aa->aa_flags & AFA_PHASE2) ? 2 : 1;
|
||||
((struct netrange *)&sat->sat_zero)->nr_firstnet = aa->aa_firstnet;
|
||||
((struct netrange *)&sat->sat_zero)->nr_lastnet = aa->aa_lastnet;
|
||||
break;
|
||||
|
||||
case SIOCSIFADDR:
|
||||
return( at_ifinit( ifp, aa, (struct sockaddr_at *)&ifr->ifr_addr ));
|
||||
|
||||
#ifdef BSD4_4
|
||||
case SIOCAIFADDR:
|
||||
if ( sateqaddr( &ifra->ifra_addr, &aa->aa_addr )) {
|
||||
return( 0 );
|
||||
@ -283,7 +225,6 @@ at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
}
|
||||
m_free( dtom( aa0 ));
|
||||
break;
|
||||
#endif BSD4_4
|
||||
|
||||
default:
|
||||
if ( ifp == 0 || ifp->if_ioctl == 0 )
|
||||
@ -292,60 +233,25 @@ at_control( int cmd, caddr_t data, struct ifnet *ifp, struct proc *p )
|
||||
}
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static int
|
||||
at_scrub( ifp, aa )
|
||||
struct ifnet *ifp;
|
||||
struct at_ifaddr *aa;
|
||||
{
|
||||
#ifndef BSD4_4
|
||||
struct sockaddr_at netsat;
|
||||
u_short net;
|
||||
#endif BSD4_4
|
||||
int error;
|
||||
|
||||
if ( aa->aa_flags & AFA_ROUTE ) {
|
||||
#ifdef BSD4_4
|
||||
if (( error = rtinit( &(aa->aa_ifa), RTM_DELETE,
|
||||
( ifp->if_flags & IFF_LOOPBACK ) ? RTF_HOST : 0 )) != 0 ) {
|
||||
return( error );
|
||||
}
|
||||
aa->aa_ifa.ifa_flags &= ~IFA_ROUTE;
|
||||
#else BSD4_4
|
||||
if ( ifp->if_flags & IFF_LOOPBACK ) {
|
||||
rtinit( &aa->aa_addr, &aa->aa_addr, SIOCDELRT, RTF_HOST );
|
||||
} else {
|
||||
bzero( &netsat, sizeof( struct sockaddr_at ));
|
||||
netsat.sat_family = AF_APPLETALK;
|
||||
netsat.sat_addr.s_node = ATADDR_ANYNODE;
|
||||
|
||||
/*
|
||||
* If the range is the full 0-fffe range, just use
|
||||
* the default route.
|
||||
*/
|
||||
if ( aa->aa_firstnet == htons( 0x0000 ) &&
|
||||
aa->aa_lastnet == htons( 0xfffe )) {
|
||||
netsat.sat_addr.s_net = 0;
|
||||
rtinit((struct sockaddr *)&netsat, &aa->aa_addr,
|
||||
(int)SIOCDELRT, 0 );
|
||||
} else {
|
||||
for ( net = ntohs( aa->aa_firstnet );
|
||||
net <= ntohs( aa->aa_lastnet ); net++ ) {
|
||||
netsat.sat_addr.s_net = htons( net );
|
||||
rtinit((struct sockaddr *)&netsat, &aa->aa_addr,
|
||||
(int)SIOCDELRT, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif BSD4_4
|
||||
aa->aa_flags &= ~AFA_ROUTE;
|
||||
}
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
#if !defined( __FreeBSD__ )
|
||||
extern struct timeval time;
|
||||
#endif __FreeBSD__
|
||||
|
||||
static int
|
||||
at_ifinit( ifp, aa, sat )
|
||||
struct ifnet *ifp;
|
||||
@ -353,18 +259,15 @@ at_ifinit( ifp, aa, sat )
|
||||
struct sockaddr_at *sat;
|
||||
{
|
||||
struct netrange nr, onr;
|
||||
#ifdef BSD4_4
|
||||
struct sockaddr_at oldaddr;
|
||||
#else BSD4_4
|
||||
struct sockaddr oldaddr;
|
||||
#endif BSD4_4
|
||||
struct sockaddr_at netaddr;
|
||||
int s = splimp(), error = 0, i, j, netinc, nodeinc, nnets;
|
||||
int s = splimp(), error = 0, i, j;
|
||||
int flags = RTF_UP, netinc, nodeinc, nnets;
|
||||
u_short net;
|
||||
|
||||
oldaddr = aa->aa_addr;
|
||||
bzero( AA_SAT( aa ), sizeof( struct sockaddr_at ));
|
||||
bcopy( sat->sat_zero, &nr, sizeof( struct netrange ));
|
||||
bcopy( sat->sat_zero, AA_SAT( aa )->sat_zero, sizeof( struct netrange ));
|
||||
nnets = ntohs( nr.nr_lastnet ) - ntohs( nr.nr_firstnet ) + 1;
|
||||
|
||||
onr.nr_firstnet = aa->aa_firstnet;
|
||||
@ -372,6 +275,13 @@ at_ifinit( ifp, aa, sat )
|
||||
aa->aa_firstnet = nr.nr_firstnet;
|
||||
aa->aa_lastnet = nr.nr_lastnet;
|
||||
|
||||
/* XXX ALC */
|
||||
printf("at_ifinit: %s: %u.%u range %u-%u phase %d\n",
|
||||
ifp->if_name,
|
||||
ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
|
||||
ntohs(aa->aa_firstnet), ntohs(aa->aa_lastnet),
|
||||
(aa->aa_flags & AFA_PHASE2) ? 2 : 1);
|
||||
|
||||
/*
|
||||
* We could eliminate the need for a second phase 1 probe (post
|
||||
* autoconf) if we check whether we're resetting the node. Note
|
||||
@ -379,17 +289,17 @@ at_ifinit( ifp, aa, sat )
|
||||
* phase 2, both the net and node must be the same.
|
||||
*/
|
||||
if ( ifp->if_flags & IFF_LOOPBACK ) {
|
||||
#ifdef BSD4_4
|
||||
AA_SAT( aa )->sat_len = sat->sat_len;
|
||||
#endif BSD4_4
|
||||
AA_SAT( aa )->sat_family = AF_APPLETALK;
|
||||
AA_SAT( aa )->sat_addr.s_net = sat->sat_addr.s_net;
|
||||
AA_SAT( aa )->sat_addr.s_node = sat->sat_addr.s_node;
|
||||
#if 0
|
||||
} else if ( fp->if_flags & IFF_POINTOPOINT) {
|
||||
/* unimplemented */
|
||||
#endif
|
||||
} else {
|
||||
aa->aa_flags |= AFA_PROBING;
|
||||
#ifdef BSD4_4
|
||||
AA_SAT( aa )->sat_len = sizeof(struct sockaddr_at);
|
||||
#endif BSD4_4
|
||||
AA_SAT( aa )->sat_family = AF_APPLETALK;
|
||||
if ( aa->aa_flags & AFA_PHASE2 ) {
|
||||
if ( sat->sat_addr.s_net == ATADDR_ANYNET ) {
|
||||
@ -431,14 +341,8 @@ at_ifinit( ifp, aa, sat )
|
||||
aa->aa_probcnt = 10;
|
||||
timeout( (timeout_func_t)aarpprobe, (caddr_t)ifp, hz / 5 );
|
||||
splx( s );
|
||||
if (
|
||||
#if defined( __FreeBSD__ )
|
||||
tsleep( aa, PPAUSE|PCATCH, "at_ifinit", 0 )
|
||||
#else
|
||||
sleep( aa, PSLEP|PCATCH )
|
||||
#endif
|
||||
) {
|
||||
printf( "at_ifinit why did this happen?!\n" );
|
||||
if ( tsleep( aa, PPAUSE|PCATCH, "at_ifinit", 0 )) {
|
||||
printf( "at_ifinit: why did this happen?!\n" );
|
||||
aa->aa_addr = oldaddr;
|
||||
aa->aa_firstnet = onr.nr_firstnet;
|
||||
aa->aa_lastnet = onr.nr_lastnet;
|
||||
@ -467,86 +371,79 @@ at_ifinit( ifp, aa, sat )
|
||||
|
||||
if ( ifp->if_ioctl &&
|
||||
( error = (*ifp->if_ioctl)( ifp, SIOCSIFADDR, (caddr_t)aa ))) {
|
||||
splx( s );
|
||||
aa->aa_addr = oldaddr;
|
||||
aa->aa_firstnet = onr.nr_firstnet;
|
||||
aa->aa_lastnet = onr.nr_lastnet;
|
||||
splx( s );
|
||||
return( error );
|
||||
}
|
||||
|
||||
#ifdef BSD4_4
|
||||
aa->aa_netmask.sat_len = 6/*sizeof(struct sockaddr_at)*/;
|
||||
/* Initialize interface netmask, which is silly for us */
|
||||
|
||||
bzero(&aa->aa_netmask, sizeof(aa->aa_netmask));
|
||||
aa->aa_netmask.sat_len = sizeof(struct sockaddr_at);
|
||||
aa->aa_netmask.sat_family = AF_APPLETALK;
|
||||
aa->aa_netmask.sat_addr.s_net = 0xffff;
|
||||
aa->aa_netmask.sat_addr.s_node = 0;
|
||||
#if defined( __FreeBSD__ )
|
||||
aa->aa_ifa.ifa_netmask =(struct sockaddr *) &(aa->aa_netmask); /* XXX */
|
||||
#endif __FreeBSD__
|
||||
#endif BSD4_4
|
||||
aa->aa_ifa.ifa_netmask = (struct sockaddr *) &aa->aa_netmask;
|
||||
|
||||
if ( ifp->if_flags & IFF_LOOPBACK ) {
|
||||
#ifndef BSD4_4
|
||||
rtinit( &aa->aa_addr, &aa->aa_addr, (int)SIOCADDRT,
|
||||
RTF_HOST|RTF_UP );
|
||||
#else BSD4_4
|
||||
error = rtinit( &(aa->aa_ifa), (int)RTM_ADD,
|
||||
#if !defined( __FreeBSD__ )
|
||||
RTF_HOST |
|
||||
#else
|
||||
/* XXX not a host route? */
|
||||
#endif __FreeBSD__
|
||||
RTF_UP );
|
||||
#endif BSD4_4
|
||||
} else {
|
||||
#ifndef BSD4_4
|
||||
/*
|
||||
* rtrequest looks for point-to-point links first. The
|
||||
* broadaddr is in the same spot as the destaddr. So, if
|
||||
* ATADDR_ANYNET is 0, and we don't fill in the broadaddr, we
|
||||
* get 0.0 routed out the ether interface. So, initialize the
|
||||
* broadaddr, even tho we don't use it.
|
||||
*
|
||||
* We *could* use the broadaddr field to reduce some of the
|
||||
* sockaddr_at overloading that we've done. E.g. Just send
|
||||
* to INTERFACE-NET.255, and have the kernel reroute that
|
||||
* to broadaddr, which would be 0.255 for phase 2 interfaces,
|
||||
* and IFACE-NET.255 for phase 1 interfaces.
|
||||
*/
|
||||
((struct sockaddr_at *)&aa->aa_broadaddr)->sat_addr.s_net =
|
||||
sat->sat_addr.s_net;
|
||||
((struct sockaddr_at *)&aa->aa_broadaddr)->sat_addr.s_node =
|
||||
ATADDR_BCAST;
|
||||
/* "Add a route to the network" */
|
||||
|
||||
bzero( &netaddr, sizeof( struct sockaddr_at ));
|
||||
netaddr.sat_family = AF_APPLETALK;
|
||||
netaddr.sat_addr.s_node = ATADDR_ANYNODE;
|
||||
if (( aa->aa_flags & AFA_PHASE2 ) == 0 ) {
|
||||
netaddr.sat_addr.s_net = AA_SAT( aa )->sat_addr.s_net;
|
||||
rtinit((struct sockaddr *)&netaddr, &aa->aa_addr,
|
||||
(int)SIOCADDRT, RTF_UP );
|
||||
} else {
|
||||
/*
|
||||
* If the range is the full 0-fffe range, just use
|
||||
* the default route.
|
||||
*/
|
||||
if ( aa->aa_firstnet == htons( 0x0000 ) &&
|
||||
aa->aa_lastnet == htons( 0xfffe )) {
|
||||
netaddr.sat_addr.s_net = 0;
|
||||
rtinit((struct sockaddr *)&netaddr, &aa->aa_addr,
|
||||
(int)SIOCADDRT, RTF_UP );
|
||||
} else {
|
||||
for ( net = ntohs( aa->aa_firstnet );
|
||||
net <= ntohs( aa->aa_lastnet ); net++ ) {
|
||||
netaddr.sat_addr.s_net = htons( net );
|
||||
rtinit((struct sockaddr *)&netaddr, &aa->aa_addr,
|
||||
(int)SIOCADDRT, RTF_UP );
|
||||
}
|
||||
}
|
||||
}
|
||||
#else BSD4_4
|
||||
error = rtinit( &(aa->aa_ifa), (int)RTM_ADD, RTF_UP );
|
||||
#endif BSD4_4
|
||||
aa->aa_ifa.ifa_metric = ifp->if_metric;
|
||||
if (ifp->if_flags & IFF_BROADCAST) {
|
||||
bzero(&aa->aa_broadaddr, sizeof(aa->aa_broadaddr));
|
||||
aa->aa_broadaddr.sat_len = sat->sat_len;
|
||||
aa->aa_broadaddr.sat_family = AF_APPLETALK;
|
||||
aa->aa_broadaddr.sat_addr.s_net = htons(0);
|
||||
aa->aa_broadaddr.sat_addr.s_node = 0xff;
|
||||
aa->aa_ifa.ifa_broadaddr = (struct sockaddr *) &aa->aa_broadaddr;
|
||||
aa->aa_netmask.sat_addr.s_net = htons(0xffff); /* XXX */
|
||||
aa->aa_netmask.sat_addr.s_node = htons(0); /* XXX */
|
||||
} else if (ifp->if_flags & IFF_LOOPBACK) {
|
||||
aa->aa_ifa.ifa_dstaddr = aa->aa_ifa.ifa_addr;
|
||||
aa->aa_netmask.sat_addr.s_net = htons(0xffff); /* XXX */
|
||||
aa->aa_netmask.sat_addr.s_node = htons(0xffff); /* XXX */
|
||||
flags |= RTF_HOST;
|
||||
} else if (ifp->if_flags & IFF_POINTOPOINT) {
|
||||
aa->aa_ifa.ifa_dstaddr = aa->aa_ifa.ifa_addr;
|
||||
aa->aa_netmask.sat_addr.s_net = htons(0xffff);
|
||||
aa->aa_netmask.sat_addr.s_node = htons(0xffff);
|
||||
flags |= RTF_HOST;
|
||||
}
|
||||
error = rtinit(&(aa->aa_ifa), (int)RTM_ADD, flags);
|
||||
|
||||
#if 0
|
||||
if ( ifp->if_flags & IFF_LOOPBACK ) {
|
||||
struct at_addr rtaddr, rtmask;
|
||||
|
||||
bzero(&rtaddr, sizeof(rtaddr));
|
||||
bzero(&rtmask, sizeof(rtmask));
|
||||
rtaddr.s_net = AA_SAT( aa )->sat_addr.s_net;
|
||||
rtaddr.s_node = AA_SAT( aa )->sat_addr.s_node;
|
||||
rtmask.s_net = 0xffff;
|
||||
rtmask.s_node = 0xff;
|
||||
|
||||
error = aa_addsingleroute(&aa->aa_ifa, &rtaddr, &rtmask);
|
||||
|
||||
} else {
|
||||
|
||||
/* Install routes for our own network, and then also for
|
||||
all networks above and below it in the network range */
|
||||
|
||||
error = aa_addrangeroute(&aa->aa_ifa,
|
||||
ntohs(aa->aa_addr.sat_addr.s_net),
|
||||
ntohs(aa->aa_addr.sat_addr.s_net) + 1);
|
||||
if (!error
|
||||
&& ntohs(aa->aa_firstnet) < ntohs(aa->aa_addr.sat_addr.s_net))
|
||||
error = aa_addrangeroute(&aa->aa_ifa,
|
||||
ntohs(aa->aa_firstnet), ntohs(aa->aa_addr.sat_addr.s_net));
|
||||
if (!error
|
||||
&& ntohs(aa->aa_addr.sat_addr.s_net) < ntohs(aa->aa_lastnet))
|
||||
error = aa_addrangeroute(&aa->aa_ifa,
|
||||
ntohs(aa->aa_addr.sat_addr.s_net) + 1,
|
||||
ntohs(aa->aa_lastnet) + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if ( error ) {
|
||||
aa->aa_addr = oldaddr;
|
||||
aa->aa_firstnet = onr.nr_firstnet;
|
||||
@ -555,9 +452,7 @@ at_ifinit( ifp, aa, sat )
|
||||
return( error );
|
||||
}
|
||||
|
||||
#ifdef BSD4_4
|
||||
aa->aa_ifa.ifa_flags |= IFA_ROUTE;
|
||||
#endif BSD4_4
|
||||
aa->aa_flags |= AFA_ROUTE;
|
||||
splx( s );
|
||||
return( 0 );
|
||||
@ -586,6 +481,146 @@ at_broadcast( sat )
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
* aa_addrangeroute()
|
||||
*
|
||||
* Add a route for a range of networks from bot to top - 1.
|
||||
* Algorithm:
|
||||
*
|
||||
* Split the range into three subranges such that the middle
|
||||
* subrange is from (base + 2^N) to (base + 2^N + 2^(N-1)) for
|
||||
* some N. Then add a route for the middle range and recurse on
|
||||
* the upper and lower sub-ranges. As a degenerate case, it may
|
||||
* be that the middle subrange is empty.
|
||||
*/
|
||||
|
||||
static int
|
||||
aa_addrangeroute(struct ifaddr *ifa, int bot, int top)
|
||||
{
|
||||
int base, mask, mbot, mtop;
|
||||
int a, b, abit, bbit, error;
|
||||
struct at_addr rtaddr, rtmask;
|
||||
|
||||
/* Special case the whole range */
|
||||
|
||||
if (bot == 0 && top == 0xffff)
|
||||
{
|
||||
bzero(&rtaddr, sizeof(rtaddr));
|
||||
bzero(&rtmask, sizeof(rtmask));
|
||||
return(aa_addsingleroute(ifa, &rtaddr, &rtmask));
|
||||
}
|
||||
|
||||
if (top <= bot)
|
||||
panic("aa_addrangeroute");
|
||||
|
||||
/* Mask out the high order bits on which both bounds agree */
|
||||
|
||||
for (mask = 0xffff; (bot & mask) != (top & mask); mask <<= 1);
|
||||
base = bot & mask;
|
||||
a = bot & ~mask;
|
||||
b = top & ~mask;
|
||||
|
||||
/* Find suitable powers of two between a and b we can make a route with */
|
||||
|
||||
for (bbit = 0x8000; bbit > b; bbit >>= 1);
|
||||
if (a == 0)
|
||||
abit = 0;
|
||||
else
|
||||
{
|
||||
for (abit = 0x0001; a > abit; abit <<= 1);
|
||||
if ((abit << 1) > bbit)
|
||||
bbit = abit;
|
||||
else
|
||||
bbit = abit << 1;
|
||||
}
|
||||
|
||||
/* Now we have a "square" middle chunk from abit to bbit, possibly empty */
|
||||
|
||||
mbot = base + abit;
|
||||
mtop = base + bbit;
|
||||
mask = ~(bbit - 1);
|
||||
|
||||
/* Route to the middle chunk */
|
||||
|
||||
if (mbot < mtop)
|
||||
{
|
||||
bzero(&rtaddr, sizeof(rtaddr));
|
||||
bzero(&rtmask, sizeof(rtmask));
|
||||
rtaddr.s_net = htons((u_short) mbot);
|
||||
rtmask.s_net = htons((u_short) mask);
|
||||
if ((error = aa_addsingleroute(ifa, &rtaddr, &rtmask)))
|
||||
return(error);
|
||||
}
|
||||
|
||||
/* Recurse on the upper and lower chunks we didn't get to */
|
||||
|
||||
if (bot < mbot)
|
||||
if ((error = aa_addrangeroute(ifa, bot, mbot)))
|
||||
{
|
||||
if (mbot < mtop)
|
||||
aa_delsingleroute(ifa, &rtaddr, &rtmask);
|
||||
return(error);
|
||||
}
|
||||
if (mtop < top)
|
||||
if ((error = aa_addrangeroute(ifa, mtop, top)))
|
||||
{
|
||||
if (mbot < mtop)
|
||||
aa_delsingleroute(ifa, &rtaddr, &rtmask);
|
||||
return(error);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
aa_addsingleroute(struct ifaddr *ifa,
|
||||
struct at_addr *addr, struct at_addr *mask)
|
||||
{
|
||||
int error;
|
||||
|
||||
printf("aa_addsingleroute: %x.%x mask %x.%x ...\n",
|
||||
ntohs(addr->s_net), addr->s_node,
|
||||
ntohs(mask->s_net), mask->s_node);
|
||||
|
||||
error = aa_dosingleroute(ifa, addr, mask, RTM_ADD, RTF_UP);
|
||||
if (error)
|
||||
printf("error %d\n", error);
|
||||
return(error);
|
||||
}
|
||||
|
||||
static int
|
||||
aa_delsingleroute(struct ifaddr *ifa,
|
||||
struct at_addr *addr, struct at_addr *mask)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = aa_dosingleroute(ifa, addr, mask, RTM_DELETE, 0);
|
||||
if (error)
|
||||
printf("aa_delsingleroute: error %d\n", error);
|
||||
return(error);
|
||||
}
|
||||
|
||||
static int
|
||||
aa_dosingleroute(struct ifaddr *ifa,
|
||||
struct at_addr *at_addr, struct at_addr *at_mask, int cmd, int flags)
|
||||
{
|
||||
struct sockaddr_at addr, mask;
|
||||
|
||||
bzero(&addr, sizeof(addr));
|
||||
bzero(&mask, sizeof(mask));
|
||||
addr.sat_family = AF_APPLETALK;
|
||||
addr.sat_len = sizeof(struct sockaddr_at);
|
||||
addr.sat_addr.s_net = at_addr->s_net;
|
||||
addr.sat_addr.s_node = at_addr->s_node;
|
||||
mask.sat_addr.s_net = at_mask->s_net;
|
||||
mask.sat_addr.s_node = at_mask->s_node;
|
||||
if (at_mask->s_node)
|
||||
flags |= RTF_HOST;
|
||||
return(rtrequest(cmd, (struct sockaddr *) &addr, ifa->ifa_addr,
|
||||
(struct sockaddr *) &mask, flags, NULL));
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
static void
|
||||
aa_clean(void)
|
||||
{
|
||||
@ -612,3 +647,6 @@ aa_clean(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -28,14 +28,12 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <sys/kernel.h>
|
||||
#include <net/if.h>
|
||||
#include <net/radix.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#include <net/route.h>
|
||||
#endif
|
||||
|
||||
#include "at.h"
|
||||
#include "ddp.h"
|
||||
@ -44,12 +42,6 @@
|
||||
#include <netatalk/at_extern.h>
|
||||
|
||||
|
||||
#ifdef ultrix
|
||||
extern int ddp_ifoutput();
|
||||
extern int ddp_ifinput();
|
||||
extern int ddp_ifioctl();
|
||||
#endif ultrix
|
||||
|
||||
struct protosw atalksw[] = {
|
||||
{
|
||||
/* Identifiers */
|
||||
@ -67,29 +59,16 @@ struct protosw atalksw[] = {
|
||||
ddp_usrreq,
|
||||
/* utility routines. */
|
||||
ddp_init, 0, 0, 0,
|
||||
#ifdef ultrix
|
||||
/* interface hooks */
|
||||
ddp_ifoutput, ddp_ifinput, ddp_ifioctl, 0,
|
||||
#endif ultrix
|
||||
},
|
||||
};
|
||||
|
||||
#if defined( __FreeBSD__ ) && defined ( NETATALKDEBUG )
|
||||
extern int at_inithead();
|
||||
#endif
|
||||
|
||||
struct domain atalkdomain = {
|
||||
AF_APPLETALK, "appletalk", 0, 0, 0,
|
||||
atalksw, &atalksw[sizeof(atalksw)/sizeof(atalksw[0])]
|
||||
#if defined( __FreeBSD__ )
|
||||
#ifdef NETATALKDEBUG
|
||||
, 0, at_inithead, 32, sizeof(struct sockaddr_at)
|
||||
#else
|
||||
, 0, rn_inithead, 32, sizeof(struct sockaddr_at)
|
||||
#endif
|
||||
#endif
|
||||
atalksw, &atalksw[sizeof(atalksw)/sizeof(atalksw[0])],
|
||||
0, rn_inithead,
|
||||
((caddr_t) &((struct sockaddr_at *) 0)->sat_addr - (caddr_t)0),
|
||||
sizeof(struct sockaddr_at)
|
||||
};
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
DOMAIN_SET(atalk);
|
||||
#endif
|
||||
|
||||
|
@ -78,7 +78,6 @@ at_addroute(void *v_arg, void *n_arg, struct radix_node_head *head,
|
||||
struct radix_node *treenodes)
|
||||
{
|
||||
struct radix_node *rn;
|
||||
struct sockaddr_at *dst = v_arg, *mask = n_arg;
|
||||
|
||||
printf("at_addroute: v=%s\n", prsockaddr(v_arg));
|
||||
printf("at_addroute: n=%s\n", prsockaddr(n_arg));
|
||||
@ -95,7 +94,6 @@ static struct radix_node *
|
||||
at_matroute(void *v_arg, struct radix_node_head *head)
|
||||
{
|
||||
struct radix_node *rn;
|
||||
struct sockaddr_at *dst = v_arg;
|
||||
|
||||
printf("at_matroute: v=%s\n", prsockaddr(v_arg));
|
||||
printf("at_matroute: head=%x\n", head);
|
||||
|
@ -30,22 +30,16 @@
|
||||
struct at_ifaddr {
|
||||
struct ifaddr aa_ifa;
|
||||
# define aa_ifp aa_ifa.ifa_ifp
|
||||
#ifdef BSD4_4
|
||||
struct sockaddr_at aa_addr;
|
||||
struct sockaddr_at aa_broadaddr;
|
||||
# define aa_dstaddr aa_netmask
|
||||
struct sockaddr_at aa_netmask;
|
||||
#else BSD4_4
|
||||
# define aa_addr aa_ifa.ifa_addr
|
||||
# define aa_broadaddr aa_ifa.ifa_broadaddr
|
||||
# define aa_dstaddr aa_ifa.ifa_dstaddr
|
||||
#endif BSD4_4
|
||||
int aa_flags;
|
||||
u_short aa_firstnet, aa_lastnet;
|
||||
int aa_probcnt;
|
||||
struct at_ifaddr *aa_next;
|
||||
};
|
||||
|
||||
#ifdef BSD4_4
|
||||
struct at_aliasreq {
|
||||
char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
|
||||
struct sockaddr_at ifra_addr;
|
||||
@ -53,7 +47,6 @@ struct at_aliasreq {
|
||||
#define ifra_dstaddr ifra_broadaddr
|
||||
struct sockaddr_at ifra_mask;
|
||||
};
|
||||
#endif BSD4_4
|
||||
|
||||
#define AA_SAT(aa) \
|
||||
((struct sockaddr_at *)&((struct at_ifaddr *)(aa))->aa_addr)
|
||||
@ -68,4 +61,5 @@ struct at_ifaddr *at_ifaddr;
|
||||
struct ifqueue atintrq1, atintrq2;
|
||||
int atdebug;
|
||||
#endif
|
||||
|
||||
#endif /* _NETATALK_AT_VAR_H_ */
|
||||
|
@ -5,20 +5,15 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <net/netisr.h>
|
||||
#endif __FreeBSD__
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <net/if.h>
|
||||
#include <net/route.h>
|
||||
#ifdef _IBMR2
|
||||
#include <net/spl.h>
|
||||
#endif _IBMR2
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
|
||||
@ -47,27 +42,17 @@ atintr( void )
|
||||
int s;
|
||||
|
||||
for (;;) {
|
||||
#ifndef _IBMR2
|
||||
s = splimp();
|
||||
#endif _IBMR2
|
||||
|
||||
#ifdef BSD4_4
|
||||
IF_DEQUEUE( &atintrq2, m );
|
||||
#else BSD4_4
|
||||
IF_DEQUEUEIF( &atintrq2, m, ifp );
|
||||
#endif BSD4_4
|
||||
|
||||
#ifndef _IBMR2
|
||||
splx( s );
|
||||
#endif _IBMR2
|
||||
|
||||
if ( m == 0 ) { /* no more queued packets */
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef BSD4_4
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
#endif BSD4_4
|
||||
for ( aa = at_ifaddr; aa; aa = aa->aa_next ) {
|
||||
if ( aa->aa_ifp == ifp && ( aa->aa_flags & AFA_PHASE2 )) {
|
||||
break;
|
||||
@ -82,27 +67,17 @@ atintr( void )
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
#ifndef _IBMR2
|
||||
s = splimp();
|
||||
#endif _IBMR2
|
||||
|
||||
#ifdef BSD4_4
|
||||
IF_DEQUEUE( &atintrq1, m );
|
||||
#else BSD4_4
|
||||
IF_DEQUEUEIF( &atintrq1, m, ifp );
|
||||
#endif BSD4_4
|
||||
|
||||
#ifndef _IBMR2
|
||||
splx( s );
|
||||
#endif _IBMR2
|
||||
|
||||
if ( m == 0 ) { /* no more queued packets */
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef BSD4_4
|
||||
ifp = m->m_pkthdr.rcvif;
|
||||
#endif BSD4_4
|
||||
for ( aa = at_ifaddr; aa; aa = aa->aa_next ) {
|
||||
if ( aa->aa_ifp == ifp && ( aa->aa_flags & AFA_PHASE2 ) == 0 ) {
|
||||
break;
|
||||
@ -132,9 +107,7 @@ atintr( void )
|
||||
return;
|
||||
}
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
NETISR_SET(NETISR_ATALK, atintr);
|
||||
#endif __FreeBSD__
|
||||
|
||||
struct route forwro;
|
||||
|
||||
@ -148,13 +121,10 @@ ddp_input( m, ifp, elh, phase )
|
||||
struct sockaddr_at from, to;
|
||||
struct ddpshdr *dsh, ddps;
|
||||
struct at_ifaddr *aa;
|
||||
struct ddpehdr *deh, ddpe;
|
||||
#ifndef BSD4_4
|
||||
struct mbuf *mp;
|
||||
#endif BSD4_4
|
||||
struct ddpehdr *deh = NULL, ddpe;
|
||||
struct ddpcb *ddp;
|
||||
int dlen, mlen;
|
||||
u_short cksum;
|
||||
u_short cksum = 0;
|
||||
|
||||
bzero( (caddr_t)&from, sizeof( struct sockaddr_at ));
|
||||
if ( elh ) {
|
||||
@ -255,13 +225,7 @@ ddp_input( m, ifp, elh, phase )
|
||||
* at a link layer. We do this before we attempt to forward a packet,
|
||||
* possibly on a different media.
|
||||
*/
|
||||
#ifdef BSD4_4
|
||||
mlen = m->m_pkthdr.len;
|
||||
#else BSD4_4
|
||||
for ( mlen = 0, mp = m; mp; mp = mp->m_next ) {
|
||||
mlen += mp->m_len;
|
||||
}
|
||||
#endif BSD4_4
|
||||
if ( mlen < dlen ) {
|
||||
ddpstat.ddps_toosmall++;
|
||||
m_freem( m );
|
||||
@ -285,18 +249,12 @@ ddp_input( m, ifp, elh, phase )
|
||||
to.sat_addr.s_net ||
|
||||
satosat( &forwro.ro_dst )->sat_addr.s_node !=
|
||||
to.sat_addr.s_node )) {
|
||||
#ifdef ultrix
|
||||
rtfree( forwro.ro_rt );
|
||||
#else ultrix
|
||||
RTFREE( forwro.ro_rt );
|
||||
#endif ultrix
|
||||
forwro.ro_rt = (struct rtentry *)0;
|
||||
}
|
||||
if ( forwro.ro_rt == (struct rtentry *)0 ||
|
||||
forwro.ro_rt->rt_ifp == (struct ifnet *)0 ) {
|
||||
#ifdef BSD4_4
|
||||
forwro.ro_dst.sa_len = sizeof( struct sockaddr_at );
|
||||
#endif BSD4_4
|
||||
forwro.ro_dst.sa_family = AF_APPLETALK;
|
||||
satosat( &forwro.ro_dst )->sat_addr.s_net = to.sat_addr.s_net;
|
||||
satosat( &forwro.ro_dst )->sat_addr.s_node = to.sat_addr.s_node;
|
||||
@ -326,9 +284,7 @@ ddp_input( m, ifp, elh, phase )
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef BSD4_4
|
||||
from.sat_len = sizeof( struct sockaddr_at );
|
||||
#endif BSD4_4
|
||||
from.sat_family = AF_APPLETALK;
|
||||
|
||||
if ( elh ) {
|
||||
@ -356,6 +312,8 @@ ddp_input( m, ifp, elh, phase )
|
||||
sorwakeup( ddp->ddp_socket );
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
#define BPXLEN 48
|
||||
#define BPALEN 16
|
||||
#include <ctype.h>
|
||||
@ -411,3 +369,4 @@ m_printm( struct mbuf *m )
|
||||
bprint( mtod( m, char * ), m->m_len );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -23,9 +23,7 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <sys/systm.h>
|
||||
#endif __FreeBSD__
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/errno.h>
|
||||
@ -50,44 +48,15 @@ int ddp_cksum = 1;
|
||||
int
|
||||
ddp_output( struct ddpcb *ddp, struct mbuf *m)
|
||||
{
|
||||
#ifndef BSD4_4
|
||||
struct mbuf *m0;
|
||||
int len;
|
||||
#endif BSD4_4
|
||||
struct ifnet *ifp;
|
||||
struct at_ifaddr *aa = NULL;
|
||||
struct ddpehdr *deh;
|
||||
u_short net;
|
||||
|
||||
#ifdef BSD4_4
|
||||
M_PREPEND( m, sizeof( struct ddpehdr ), M_WAIT );
|
||||
#else BSD4_4
|
||||
for ( len = 0, m0 = m; m; m = m->m_next ) {
|
||||
len += m->m_len;
|
||||
}
|
||||
MGET( m, M_WAIT, MT_HEADER );
|
||||
if ( m == 0 ) {
|
||||
m_freem( m0 );
|
||||
return( ENOBUFS );
|
||||
}
|
||||
m->m_next = m0;
|
||||
#endif BSD4_4
|
||||
|
||||
#ifndef BSD4_4
|
||||
# define align(a) (((a)+3)&0xfc)
|
||||
m->m_off = MMINOFF + align( SZ_ELAPHDR );
|
||||
m->m_len = sizeof( struct ddpehdr );
|
||||
#endif BSD4_4
|
||||
|
||||
deh = mtod( m, struct ddpehdr *);
|
||||
deh->deh_pad = 0;
|
||||
deh->deh_hops = 0;
|
||||
|
||||
#ifdef BSD4_4
|
||||
deh->deh_len = m->m_pkthdr.len;
|
||||
#else BSD4_4
|
||||
deh->deh_len = len + sizeof( struct ddpehdr );
|
||||
#endif BSD4_4
|
||||
|
||||
deh->deh_dnet = ddp->ddp_fsat.sat_addr.s_net;
|
||||
deh->deh_dnode = ddp->ddp_fsat.sat_addr.s_node;
|
||||
@ -145,15 +114,10 @@ ddp_route( struct mbuf *m, struct route *ro)
|
||||
struct mbuf *m0;
|
||||
struct at_ifaddr *aa = NULL;
|
||||
struct ifnet *ifp = NULL;
|
||||
int mlen;
|
||||
u_short net;
|
||||
|
||||
if ( ro->ro_rt && ( ifp = ro->ro_rt->rt_ifp )) {
|
||||
#ifdef BSD4_4
|
||||
net = satosat( ro->ro_rt->rt_gateway )->sat_addr.s_net;
|
||||
#else BSD4_4
|
||||
net = satosat( &ro->ro_rt->rt_gateway )->sat_addr.s_net;
|
||||
#endif BSD4_4
|
||||
for ( aa = at_ifaddr; aa; aa = aa->aa_next ) {
|
||||
if ( aa->aa_ifp == ifp &&
|
||||
ntohs( net ) >= ntohs( aa->aa_firstnet ) &&
|
||||
@ -174,35 +138,7 @@ printf( "ddp_route: oops\n" );
|
||||
* This is bad for transition routing, since phase 1 and phase 2
|
||||
* packets end up poorly aligned due to the three byte elap header.
|
||||
*/
|
||||
if ( aa->aa_flags & AFA_PHASE2 ) {
|
||||
#if defined( __FreeBSD__ )
|
||||
/* XXX don't need this because we can change if_ethersubr.c */
|
||||
#else
|
||||
for ( mlen = 0, m0 = m; m0; m0 = m0->m_next ) {
|
||||
mlen += m0->m_len;
|
||||
}
|
||||
#ifndef MIN
|
||||
#define MIN(x,y) ((x)<(y)?(x):(y))
|
||||
#endif
|
||||
if (( m = m_pullup( m, MIN( MLEN, mlen ))) == 0 ) {
|
||||
printf("ddp_route: m_pullup of %d (mlen=%d) failed\n",
|
||||
MIN( MLEN, mlen ), mlen);
|
||||
return( ENOBUFS );
|
||||
}
|
||||
#endif __FreeBSD__
|
||||
} else {
|
||||
# ifdef notdef
|
||||
#ifdef BSD4_4
|
||||
M_PREPEND( m, SZ_ELAPHDR, M_DONTWAIT );
|
||||
if ( m == NULL ) {
|
||||
return( ENOBUFS );
|
||||
}
|
||||
#else BSD4_4
|
||||
m->m_off -= SZ_ELAPHDR;
|
||||
m->m_len += SZ_ELAPHDR;
|
||||
#endif BSD4_4
|
||||
# endif notdef
|
||||
|
||||
if ( !(aa->aa_flags & AFA_PHASE2) ) {
|
||||
MGET( m0, M_WAIT, MT_HEADER );
|
||||
if ( m0 == 0 ) {
|
||||
m_freem( m );
|
||||
@ -210,12 +146,7 @@ printf( "ddp_route: oops\n" );
|
||||
return( ENOBUFS );
|
||||
}
|
||||
m0->m_next = m;
|
||||
|
||||
#ifndef BSD4_4
|
||||
m0->m_off = MMINOFF + align( sizeof( struct ether_header ));
|
||||
#else
|
||||
/* XXX perhaps we ought to align the header? */
|
||||
#endif BSD4_4
|
||||
m0->m_len = SZ_ELAPHDR;
|
||||
m = m0;
|
||||
|
||||
@ -228,11 +159,7 @@ printf( "ddp_route: oops\n" );
|
||||
ntohs( aa->aa_lastnet )) {
|
||||
elh->el_dnode = satosat( &ro->ro_dst )->sat_addr.s_node;
|
||||
} else {
|
||||
#ifdef BSD4_4
|
||||
elh->el_dnode = satosat( ro->ro_rt->rt_gateway )->sat_addr.s_node;
|
||||
#else BSD4_4
|
||||
elh->el_dnode = satosat( &ro->ro_rt->rt_gateway )->sat_addr.s_node;
|
||||
#endif BSD4_4
|
||||
}
|
||||
}
|
||||
|
||||
@ -242,57 +169,10 @@ printf( "ddp_route: oops\n" );
|
||||
ntohs( aa->aa_lastnet )) {
|
||||
gate = *satosat( &ro->ro_dst );
|
||||
} else {
|
||||
#ifdef BSD4_4
|
||||
gate = *satosat( ro->ro_rt->rt_gateway );
|
||||
#else BSD4_4
|
||||
gate = *satosat( &ro->ro_rt->rt_gateway );
|
||||
#endif BSD4_4
|
||||
}
|
||||
ro->ro_rt->rt_use++;
|
||||
|
||||
#ifdef ultrix
|
||||
/*
|
||||
* SAIEW: We can't make changes to net/if_loop.c, so we don't route
|
||||
* further than this: if it's going to go through the lookback,
|
||||
* short-circuit to ddp_input(). Who needs queuing?
|
||||
*
|
||||
* Note: Passing NULL for the elaphdr is cool, since we'll only ever
|
||||
* try to send long form ddp throught the loopback.
|
||||
*/
|
||||
if ( ifp->if_flags & IFF_LOOPBACK ) {
|
||||
#ifdef notdef
|
||||
m->m_off += SZ_ELAPHDR;
|
||||
m->m_len -= SZ_ELAPHDR;
|
||||
#endif notdef
|
||||
ddp_input( m, ifp, (struct elaphdr *)NULL, 2 );
|
||||
return( 0 );
|
||||
}
|
||||
#endif ultrix
|
||||
|
||||
#ifdef _IBMR2
|
||||
/*
|
||||
* We can't make changes to the interface routines on RS6ks, and
|
||||
* they don't provide hooks for if_output, so we just resolve
|
||||
* our address here, and pass the packet as a raw ethernet packet.
|
||||
* This doesn't work particularly well, if we aren't *on* ethernet,
|
||||
* but it's ok for the moment.
|
||||
*/
|
||||
if ( ! ( ifp->if_flags & IFF_LOOPBACK )) {
|
||||
struct ether_header eh;
|
||||
|
||||
if ( !aarpresolve(( struct arpcom *)ifp, m,
|
||||
&gate, eh.ether_dhost )) {
|
||||
return( 0 );
|
||||
}
|
||||
eh.ether_type = htons( ETHERTYPE_AT );
|
||||
gate.sat_family = AF_UNSPEC;
|
||||
bcopy( &eh, (*(struct sockaddr *)&gate).sa_data,
|
||||
sizeof( (*(struct sockaddr *)&gate).sa_data ));
|
||||
}
|
||||
#endif _IBMR2
|
||||
return((*ifp->if_output)( ifp, m, &gate
|
||||
#if defined( __FreeBSD__ )
|
||||
, NULL /* XXX */
|
||||
#endif __FreeBSD__
|
||||
));
|
||||
return((*ifp->if_output)( ifp,
|
||||
m, (struct sockaddr *)&gate, NULL)); /* XXX */
|
||||
}
|
||||
|
@ -7,15 +7,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <sys/proc.h>
|
||||
#endif __FreeBSD__
|
||||
#ifdef ibm032
|
||||
#include <sys/dir.h>
|
||||
#endif ibm032
|
||||
#ifndef __FreeBSD__
|
||||
#include <sys/user.h>
|
||||
#endif
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
@ -25,9 +17,6 @@
|
||||
#include <net/route.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#ifdef _IBMR2
|
||||
#include <net/spl.h>
|
||||
#endif _IBMR2
|
||||
|
||||
#include "at.h"
|
||||
#include "at_var.h"
|
||||
@ -53,9 +42,7 @@ int
|
||||
ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
struct mbuf *addr, struct mbuf *rights)
|
||||
{
|
||||
#if defined( __FreeBSD__ )
|
||||
struct proc *p = curproc; /* XXX */
|
||||
#endif __FreeBSD__
|
||||
struct ddpcb *ddp;
|
||||
int error = 0;
|
||||
|
||||
@ -63,11 +50,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
|
||||
if ( req == PRU_CONTROL ) {
|
||||
return( at_control( (int) m, (caddr_t) addr,
|
||||
(struct ifnet *) rights
|
||||
#if defined( __FreeBSD__ )
|
||||
, (struct proc *)p
|
||||
#endif __FreeBSD__
|
||||
));
|
||||
(struct ifnet *) rights, (struct proc *)p ));
|
||||
}
|
||||
|
||||
if ( rights && rights->m_len ) {
|
||||
@ -97,11 +80,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
break;
|
||||
|
||||
case PRU_BIND :
|
||||
error = at_pcbsetaddr( ddp, addr
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
error = at_pcbsetaddr( ddp, addr, p );
|
||||
break;
|
||||
|
||||
case PRU_SOCKADDR :
|
||||
@ -114,11 +93,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
break;
|
||||
}
|
||||
|
||||
error = at_pcbconnect( ddp, addr
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
error = at_pcbconnect( ddp, addr, p );
|
||||
if ( error == 0 )
|
||||
soisconnected( so );
|
||||
break;
|
||||
@ -146,11 +121,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
}
|
||||
|
||||
s = splnet();
|
||||
error = at_pcbconnect( ddp, addr
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
error = at_pcbconnect( ddp, addr, p );
|
||||
if ( error ) {
|
||||
splx( s );
|
||||
break;
|
||||
@ -260,29 +231,16 @@ at_pcbsetaddr( struct ddpcb *ddp, struct mbuf *addr, struct proc *p )
|
||||
sat->sat_port >= ATPORT_LAST ) {
|
||||
return( EINVAL );
|
||||
}
|
||||
#ifdef BSD4_4
|
||||
if ( sat->sat_port < ATPORT_RESERVED &&
|
||||
#if defined( __FreeBSD__ )
|
||||
suser( p->p_ucred, &p->p_acflag )
|
||||
#else
|
||||
suser( u.u_cred, &u.u_acflag )
|
||||
#endif __FreeBSD__
|
||||
) {
|
||||
suser( p->p_ucred, &p->p_acflag ) ) {
|
||||
return( EACCES );
|
||||
}
|
||||
#else BSD4_4
|
||||
if ( sat->sat_port < ATPORT_RESERVED && ( !suser())) {
|
||||
return( EACCES );
|
||||
}
|
||||
#endif BSD4_4
|
||||
}
|
||||
} else {
|
||||
bzero( (caddr_t)&lsat, sizeof( struct sockaddr_at ));
|
||||
#ifdef BSD4_4
|
||||
lsat.sat_len = sizeof(struct sockaddr_at);
|
||||
lsat.sat_addr.s_node = ATADDR_ANYNODE;
|
||||
lsat.sat_addr.s_net = ATADDR_ANYNET;
|
||||
#endif BSD4_4
|
||||
lsat.sat_family = AF_APPLETALK;
|
||||
sat = &lsat;
|
||||
}
|
||||
@ -386,11 +344,7 @@ at_pcbconnect( struct ddpcb *ddp, struct mbuf *addr, struct proc *p)
|
||||
( hintnet ? hintnet : sat->sat_addr.s_net ) ||
|
||||
satosat( &ro->ro_dst )->sat_addr.s_node !=
|
||||
sat->sat_addr.s_node )) {
|
||||
#ifdef ultrix
|
||||
rtfree( ro->ro_rt );
|
||||
#else ultrix
|
||||
RTFREE( ro->ro_rt );
|
||||
#endif ultrix
|
||||
ro->ro_rt = (struct rtentry *)0;
|
||||
}
|
||||
}
|
||||
@ -400,9 +354,7 @@ at_pcbconnect( struct ddpcb *ddp, struct mbuf *addr, struct proc *p)
|
||||
*/
|
||||
if ( ro->ro_rt == (struct rtentry *)0 ||
|
||||
ro->ro_rt->rt_ifp == (struct ifnet *)0 ) {
|
||||
#ifdef BSD4_4
|
||||
ro->ro_dst.sa_len = sizeof( struct sockaddr_at );
|
||||
#endif BSD4_4
|
||||
ro->ro_dst.sa_family = AF_APPLETALK;
|
||||
if ( hintnet ) {
|
||||
satosat( &ro->ro_dst )->sat_addr.s_net = hintnet;
|
||||
@ -430,11 +382,7 @@ at_pcbconnect( struct ddpcb *ddp, struct mbuf *addr, struct proc *p)
|
||||
|
||||
ddp->ddp_fsat = *sat;
|
||||
if ( ddp->ddp_lsat.sat_port == ATADDR_ANYPORT ) {
|
||||
return( at_pcbsetaddr( ddp, (struct mbuf *)0
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
));
|
||||
return( at_pcbsetaddr( ddp, (struct mbuf *)0, p ));
|
||||
}
|
||||
return( 0 );
|
||||
}
|
||||
@ -566,6 +514,7 @@ ddp_init(void )
|
||||
atintrq2.ifq_maxlen = IFQ_MAXLEN;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
ddp_clean(void )
|
||||
{
|
||||
@ -575,3 +524,4 @@ ddp_clean(void )
|
||||
at_pcbdetach( ddp->ddp_socket, ddp );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -7,15 +7,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <sys/proc.h>
|
||||
#endif __FreeBSD__
|
||||
#ifdef ibm032
|
||||
#include <sys/dir.h>
|
||||
#endif ibm032
|
||||
#ifndef __FreeBSD__
|
||||
#include <sys/user.h>
|
||||
#endif
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
@ -25,9 +17,6 @@
|
||||
#include <net/route.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#ifdef _IBMR2
|
||||
#include <net/spl.h>
|
||||
#endif _IBMR2
|
||||
|
||||
#include "at.h"
|
||||
#include "at_var.h"
|
||||
@ -53,9 +42,7 @@ int
|
||||
ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
struct mbuf *addr, struct mbuf *rights)
|
||||
{
|
||||
#if defined( __FreeBSD__ )
|
||||
struct proc *p = curproc; /* XXX */
|
||||
#endif __FreeBSD__
|
||||
struct ddpcb *ddp;
|
||||
int error = 0;
|
||||
|
||||
@ -63,11 +50,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
|
||||
if ( req == PRU_CONTROL ) {
|
||||
return( at_control( (int) m, (caddr_t) addr,
|
||||
(struct ifnet *) rights
|
||||
#if defined( __FreeBSD__ )
|
||||
, (struct proc *)p
|
||||
#endif __FreeBSD__
|
||||
));
|
||||
(struct ifnet *) rights, (struct proc *)p ));
|
||||
}
|
||||
|
||||
if ( rights && rights->m_len ) {
|
||||
@ -97,11 +80,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
break;
|
||||
|
||||
case PRU_BIND :
|
||||
error = at_pcbsetaddr( ddp, addr
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
error = at_pcbsetaddr( ddp, addr, p );
|
||||
break;
|
||||
|
||||
case PRU_SOCKADDR :
|
||||
@ -114,11 +93,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
break;
|
||||
}
|
||||
|
||||
error = at_pcbconnect( ddp, addr
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
error = at_pcbconnect( ddp, addr, p );
|
||||
if ( error == 0 )
|
||||
soisconnected( so );
|
||||
break;
|
||||
@ -146,11 +121,7 @@ ddp_usrreq( struct socket *so, int req, struct mbuf *m,
|
||||
}
|
||||
|
||||
s = splnet();
|
||||
error = at_pcbconnect( ddp, addr
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
);
|
||||
error = at_pcbconnect( ddp, addr, p );
|
||||
if ( error ) {
|
||||
splx( s );
|
||||
break;
|
||||
@ -260,29 +231,16 @@ at_pcbsetaddr( struct ddpcb *ddp, struct mbuf *addr, struct proc *p )
|
||||
sat->sat_port >= ATPORT_LAST ) {
|
||||
return( EINVAL );
|
||||
}
|
||||
#ifdef BSD4_4
|
||||
if ( sat->sat_port < ATPORT_RESERVED &&
|
||||
#if defined( __FreeBSD__ )
|
||||
suser( p->p_ucred, &p->p_acflag )
|
||||
#else
|
||||
suser( u.u_cred, &u.u_acflag )
|
||||
#endif __FreeBSD__
|
||||
) {
|
||||
suser( p->p_ucred, &p->p_acflag ) ) {
|
||||
return( EACCES );
|
||||
}
|
||||
#else BSD4_4
|
||||
if ( sat->sat_port < ATPORT_RESERVED && ( !suser())) {
|
||||
return( EACCES );
|
||||
}
|
||||
#endif BSD4_4
|
||||
}
|
||||
} else {
|
||||
bzero( (caddr_t)&lsat, sizeof( struct sockaddr_at ));
|
||||
#ifdef BSD4_4
|
||||
lsat.sat_len = sizeof(struct sockaddr_at);
|
||||
lsat.sat_addr.s_node = ATADDR_ANYNODE;
|
||||
lsat.sat_addr.s_net = ATADDR_ANYNET;
|
||||
#endif BSD4_4
|
||||
lsat.sat_family = AF_APPLETALK;
|
||||
sat = &lsat;
|
||||
}
|
||||
@ -386,11 +344,7 @@ at_pcbconnect( struct ddpcb *ddp, struct mbuf *addr, struct proc *p)
|
||||
( hintnet ? hintnet : sat->sat_addr.s_net ) ||
|
||||
satosat( &ro->ro_dst )->sat_addr.s_node !=
|
||||
sat->sat_addr.s_node )) {
|
||||
#ifdef ultrix
|
||||
rtfree( ro->ro_rt );
|
||||
#else ultrix
|
||||
RTFREE( ro->ro_rt );
|
||||
#endif ultrix
|
||||
ro->ro_rt = (struct rtentry *)0;
|
||||
}
|
||||
}
|
||||
@ -400,9 +354,7 @@ at_pcbconnect( struct ddpcb *ddp, struct mbuf *addr, struct proc *p)
|
||||
*/
|
||||
if ( ro->ro_rt == (struct rtentry *)0 ||
|
||||
ro->ro_rt->rt_ifp == (struct ifnet *)0 ) {
|
||||
#ifdef BSD4_4
|
||||
ro->ro_dst.sa_len = sizeof( struct sockaddr_at );
|
||||
#endif BSD4_4
|
||||
ro->ro_dst.sa_family = AF_APPLETALK;
|
||||
if ( hintnet ) {
|
||||
satosat( &ro->ro_dst )->sat_addr.s_net = hintnet;
|
||||
@ -430,11 +382,7 @@ at_pcbconnect( struct ddpcb *ddp, struct mbuf *addr, struct proc *p)
|
||||
|
||||
ddp->ddp_fsat = *sat;
|
||||
if ( ddp->ddp_lsat.sat_port == ATADDR_ANYPORT ) {
|
||||
return( at_pcbsetaddr( ddp, (struct mbuf *)0
|
||||
#if defined( __FreeBSD__ )
|
||||
, p
|
||||
#endif __FreeBSD__
|
||||
));
|
||||
return( at_pcbsetaddr( ddp, (struct mbuf *)0, p ));
|
||||
}
|
||||
return( 0 );
|
||||
}
|
||||
@ -566,6 +514,7 @@ ddp_init(void )
|
||||
atintrq2.ifq_maxlen = IFQ_MAXLEN;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
ddp_clean(void )
|
||||
{
|
||||
@ -575,3 +524,4 @@ ddp_clean(void )
|
||||
at_pcbdetach( ddp->ddp_socket, ddp );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -21,67 +21,9 @@
|
||||
* netatalk@itd.umich.edu
|
||||
*/
|
||||
|
||||
# ifndef _ATALK_ENDIAN_H_
|
||||
#ifndef _ATALK_ENDIAN_H_
|
||||
#define _ATALK_ENDIAN_H_
|
||||
|
||||
#ifdef _IBMR2
|
||||
#include <sys/machine.h>
|
||||
#endif _IBMR2
|
||||
|
||||
#ifdef linux
|
||||
#include <bytesex.h>
|
||||
#define BYTE_ORDER __BYTE_ORDER
|
||||
#endif linux
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <machine/endian.h>
|
||||
#endif __FreeBSD__
|
||||
|
||||
# ifndef BYTE_ORDER
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#define BIG_ENDIAN 4321
|
||||
#define PDP_ENDIAN 3412
|
||||
|
||||
#ifdef sun
|
||||
#ifdef i386
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#else i386
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#endif i386
|
||||
#else
|
||||
#ifdef MIPSEB
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#else
|
||||
#ifdef MIPSEL
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#else
|
||||
Like, what is your byte order, man?
|
||||
#endif MIPSEL
|
||||
#endif MIPSEB
|
||||
#endif sun
|
||||
# endif BYTE_ORDER
|
||||
|
||||
# ifndef ntohl
|
||||
# if defined( sun ) || defined( ultrix ) || defined( _IBMR2 )
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
#define ntohl(x) (x)
|
||||
#define ntohs(x) (x)
|
||||
#define htonl(x) (x)
|
||||
#define htons(x) (x)
|
||||
|
||||
#else
|
||||
#if defined( mips ) && defined( KERNEL )
|
||||
#define ntohl(x) nuxi_l(x)
|
||||
#define ntohs(x) nuxi_s(x)
|
||||
#define htonl(x) nuxi_l(x)
|
||||
#define htons(x) nuxi_s(x)
|
||||
|
||||
#else mips KERNEL
|
||||
unsigned short ntohs(), htons();
|
||||
unsigned long ntohl(), htonl();
|
||||
|
||||
#endif mips KERNEL
|
||||
#endif BYTE_ORDER
|
||||
# endif sun ultrix _IBMR2
|
||||
# endif ntohl
|
||||
# endif _ATALK_ENDIAN_H_
|
||||
#endif _ATALK_ENDIAN_H_
|
||||
|
@ -3,83 +3,10 @@
|
||||
* All Rights Reserved.
|
||||
*/
|
||||
|
||||
# if defined( ultrix ) || defined( BSD4_4 )
|
||||
#include <net/if_llc.h>
|
||||
# if defined( __FreeBSD__ )
|
||||
#define llc_org_code llc_un.type_snap.org_code
|
||||
#define llc_ether_type llc_un.type_snap.ether_type
|
||||
# endif __FreeBSD__
|
||||
# else ultrix BSD4_4
|
||||
|
||||
#ifdef sun
|
||||
#include <net/if_ieee802.h>
|
||||
#endif sun
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988 Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* @(#)if_llc.h 7.2 (Berkeley) 6/28/90
|
||||
*/
|
||||
|
||||
/*
|
||||
* IEEE 802.2 Link Level Control headers, for use in conjunction with
|
||||
* 802.{3,4,5} media access control methods.
|
||||
*
|
||||
* Headers here do not use bit fields due to shortcommings in many
|
||||
* compilers.
|
||||
*/
|
||||
|
||||
struct llc {
|
||||
u_char llc_dsap;
|
||||
u_char llc_ssap;
|
||||
union {
|
||||
struct {
|
||||
u_char control;
|
||||
u_char format_id;
|
||||
u_char class;
|
||||
u_char window_x2;
|
||||
} type_u;
|
||||
struct {
|
||||
u_char num_snd_x2;
|
||||
u_char num_rcv_x2;
|
||||
} type_i;
|
||||
struct {
|
||||
u_char control;
|
||||
u_char num_rcv_x2;
|
||||
} type_s;
|
||||
struct {
|
||||
u_char control;
|
||||
u_char org_code[3];
|
||||
u_short ether_type;
|
||||
} type_snap;
|
||||
} llc_un;
|
||||
};
|
||||
#define llc_control llc_un.type_u.control
|
||||
#define llc_fid llc_un.type_u.format_id
|
||||
#define llc_class llc_un.type_u.class
|
||||
#define llc_window llc_un.type_u.window_x2
|
||||
#define llc_org_code llc_un.type_snap.org_code
|
||||
#define llc_ether_type llc_un.type_snap.ether_type
|
||||
|
||||
#define LLC_UI 0x3
|
||||
#define LLC_UI_P 0x13
|
||||
#define LLC_XID 0xaf
|
||||
#define LLC_XID_P 0xbf
|
||||
#define LLC_TEST 0xe3
|
||||
#define LLC_TEST_P 0xf3
|
||||
|
||||
#define LLC_ISO_LSAP 0xfe
|
||||
#define LLC_SNAP_LSAP 0xaa
|
||||
|
||||
# endif ultrix BSD4_4
|
||||
|
||||
#if defined( sun ) || defined( ibm032 )
|
||||
#define SIOCPHASE1 _IOW(i, 100, struct ifreq) /* AppleTalk phase 1 */
|
||||
#define SIOCPHASE2 _IOW(i, 101, struct ifreq) /* AppleTalk phase 2 */
|
||||
#endif sun ibm032
|
||||
|
||||
#if defined( ultrix ) || defined( BSD4_4 ) || defined( _IBMR2 )
|
||||
#define SIOCPHASE1 _IOW('i', 100, struct ifreq) /* AppleTalk phase 1 */
|
||||
#define SIOCPHASE2 _IOW('i', 101, struct ifreq) /* AppleTalk phase 2 */
|
||||
#endif ultrix BSD4_4 _IBMR2
|
||||
|
@ -70,35 +70,37 @@ static int first = 1;
|
||||
* -a (all) flag is specified.
|
||||
*/
|
||||
|
||||
char *
|
||||
at_pr_net(struct sockaddr_at *sat)
|
||||
static char *
|
||||
at_pr_net(struct sockaddr_at *sat, int numeric)
|
||||
{
|
||||
static char mybuf[50];
|
||||
|
||||
switch(sat->sat_addr.s_net) {
|
||||
case 0xffff:
|
||||
return "????";
|
||||
case ATADDR_ANYNET:
|
||||
return("*");
|
||||
default:
|
||||
sprintf(mybuf,"%hu",ntohs(sat->sat_addr.s_net));
|
||||
if (!numeric) {
|
||||
switch(sat->sat_addr.s_net) {
|
||||
case 0xffff:
|
||||
return "????";
|
||||
case ATADDR_ANYNET:
|
||||
return("*");
|
||||
}
|
||||
}
|
||||
sprintf(mybuf,"%hu",ntohs(sat->sat_addr.s_net));
|
||||
return mybuf;
|
||||
}
|
||||
|
||||
char *
|
||||
at_pr_host(struct sockaddr_at *sat)
|
||||
static char *
|
||||
at_pr_host(struct sockaddr_at *sat, int numeric)
|
||||
{
|
||||
static char mybuf[50];
|
||||
|
||||
switch(sat->sat_addr.s_node) {
|
||||
case ATADDR_BCAST:
|
||||
return "bcast";
|
||||
case ATADDR_ANYNODE:
|
||||
return("*");
|
||||
default:
|
||||
sprintf(mybuf,"%d",(unsigned int)sat->sat_addr.s_node);
|
||||
if (!numeric) {
|
||||
switch(sat->sat_addr.s_node) {
|
||||
case ATADDR_BCAST:
|
||||
return "bcast";
|
||||
case ATADDR_ANYNODE:
|
||||
return("*");
|
||||
}
|
||||
}
|
||||
sprintf(mybuf,"%d",(unsigned int)sat->sat_addr.s_node);
|
||||
return mybuf;
|
||||
}
|
||||
|
||||
@ -122,47 +124,48 @@ static char mybuf[50];
|
||||
/* 1 for net */
|
||||
/* 2 for host */
|
||||
/* 4 for port */
|
||||
/* 8 for numeric only */
|
||||
char *
|
||||
atalk_print(sa,what)
|
||||
register struct sockaddr *sa;
|
||||
{
|
||||
struct sockaddr_at *sat = (struct sockaddr_at *)sa;
|
||||
static char mybuf[50];
|
||||
static char mybuf[50];
|
||||
int numeric = (what & 0x08);
|
||||
|
||||
mybuf[0] = 0;
|
||||
switch (what & 3 ) {
|
||||
switch (what & 3) {
|
||||
case 0:
|
||||
mybuf[0] = 0;
|
||||
break;
|
||||
case 1:
|
||||
sprintf(mybuf,"%s",at_pr_net(sat));
|
||||
sprintf(mybuf,"%s",at_pr_net(sat, numeric));
|
||||
break;
|
||||
case 2:
|
||||
sprintf(mybuf,"%s",at_pr_host(sat));
|
||||
sprintf(mybuf,"%s",at_pr_host(sat, numeric));
|
||||
break;
|
||||
case 3:
|
||||
sprintf(mybuf,"[%s.%s]",
|
||||
at_pr_net(sat),
|
||||
at_pr_host(sat));
|
||||
sprintf(mybuf,"%s.%s",
|
||||
at_pr_net(sat, numeric),
|
||||
at_pr_host(sat, numeric));
|
||||
}
|
||||
if (what & 4) {
|
||||
sprintf(mybuf+strlen(mybuf),"%s",at_pr_port(sat));
|
||||
}
|
||||
#if 0
|
||||
switch(sat->sat_hints.type) {
|
||||
case SATHINT_NONE:
|
||||
sprintf(mybuf,"[no type]");
|
||||
break;
|
||||
case SATHINT_CONFIG:
|
||||
case SATHINT_IFACE:
|
||||
sprintf(mybuf,"[too hard for now]");
|
||||
break;
|
||||
default:
|
||||
sprintf(mybuf,"[unknown type]");
|
||||
}
|
||||
#endif
|
||||
return mybuf;
|
||||
}
|
||||
|
||||
char *
|
||||
atalk_print2(struct sockaddr *sa, struct sockaddr *mask, int what)
|
||||
{
|
||||
int n;
|
||||
static char buf[100];
|
||||
|
||||
n = snprintf(buf, sizeof(buf), "%s", atalk_print(sa, what));
|
||||
snprintf(buf + n, sizeof(buf) - n, "/%s", atalk_print(mask, what));
|
||||
return(buf);
|
||||
}
|
||||
|
||||
void
|
||||
atalkprotopr(off, name)
|
||||
u_long off;
|
||||
|
@ -188,8 +188,8 @@ intpr(interval, ifnetaddr)
|
||||
break;
|
||||
|
||||
case AF_APPLETALK:
|
||||
printf("atalk:%-7.7s ",atalk_print(sa,1) );
|
||||
printf("%-15.15s ",atalk_print(sa,3) );
|
||||
printf("atalk:%-7.7s ",atalk_print(sa,9) );
|
||||
printf("%-15.15s ",atalk_print(sa,11) );
|
||||
break;
|
||||
#ifdef NS
|
||||
case AF_NS:
|
||||
|
@ -88,7 +88,8 @@ void upHex __P((char *));
|
||||
|
||||
char *routename __P((u_long));
|
||||
char *netname __P((u_long, u_long));
|
||||
char *atalk_print __P((struct sockaddr *,int));
|
||||
char *atalk_print __P((struct sockaddr *, int));
|
||||
char *atalk_print2 __P((struct sockaddr *, struct sockaddr *, int));
|
||||
char *ipx_print __P((struct sockaddr *));
|
||||
char *ns_print __P((struct sockaddr *));
|
||||
void routepr __P((u_long));
|
||||
|
@ -36,7 +36,7 @@
|
||||
static char sccsid[] = "From: @(#)route.c 8.6 (Berkeley) 4/28/95";
|
||||
#endif
|
||||
static const char rcsid[] =
|
||||
"$Id: route.c,v 1.15 1996/06/10 21:03:38 julian Exp $";
|
||||
"$Id: route.c,v 1.16 1996/06/15 17:08:40 peter Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -188,7 +188,7 @@ pr_family(af)
|
||||
afname = "ISO";
|
||||
break;
|
||||
case AF_APPLETALK:
|
||||
afname = "ATALK";
|
||||
afname = "AppleTalk";
|
||||
break;
|
||||
case AF_CCITT:
|
||||
afname = "X.25";
|
||||
@ -418,7 +418,10 @@ p_sockaddr(sa, mask, flags, width)
|
||||
}
|
||||
case AF_APPLETALK:
|
||||
{
|
||||
cp = atalk_print(sa,3);
|
||||
if (mask)
|
||||
cp = atalk_print2(sa,mask,11);
|
||||
else
|
||||
cp = atalk_print(sa,11);
|
||||
break;
|
||||
}
|
||||
#ifdef NS
|
||||
|
Loading…
Reference in New Issue
Block a user