169 lines
5.0 KiB
C
169 lines
5.0 KiB
C
|
/* net1.c, 11-Sep-95 */
|
||
|
|
||
|
/* (C)opyright (C) 1993,1995 Martin Stover, Marburg, Germany
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||
|
*/
|
||
|
|
||
|
#include "net.h"
|
||
|
|
||
|
#if HAVE_TLI
|
||
|
void print_t_info(struct t_info *t)
|
||
|
{
|
||
|
DPRINTF(("T_INFO:addr %ld, options %ld, tsdu %ld, etsdu %ld\n",
|
||
|
t->addr, t->options,t->tsdu, t->etsdu));
|
||
|
DPRINTF(("connect %ld, discon %ld, servtype %ld\n",
|
||
|
t->connect, t->discon,t->servtype));
|
||
|
#if 0
|
||
|
struct t_info {
|
||
|
long addr; /* size of protocol address */
|
||
|
long options; /* size of protocol options */
|
||
|
long tsdu; /* size of max transport service data unit */
|
||
|
long etsdu; /* size of max expedited tsdu */
|
||
|
long connect; /* max data for connection primitives */
|
||
|
long discon; /* max data for disconnect primitives */
|
||
|
long servtype; /* provider service type */
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
char *visable_ipx_adr(ipxAddr_t *p)
|
||
|
{
|
||
|
static char str[200];
|
||
|
sprintf(str,"net=%x:%x:%x:%x, node=%x:%x:%x:%x:%x:%x, sock=%02x:%02x",
|
||
|
(int)p->net[0], (int)p->net[1], (int)p->net[2], (int)p->net[3],
|
||
|
(int)p->node[0], (int)p->node[1], (int)p->node[2], (int)p->node[3],
|
||
|
(int)p->node[4], (int)p->node[5], (int)p->sock[0], (int)p->sock[1]);
|
||
|
return(str);
|
||
|
}
|
||
|
|
||
|
void print_ipx_addr(ipxAddr_t *p)
|
||
|
{
|
||
|
DPRINTF(("%s\n", visable_ipx_adr(p)));
|
||
|
}
|
||
|
|
||
|
void print_ud_data(struct t_unitdata *ud)
|
||
|
{
|
||
|
int packet_typ = *(int*)(ud->opt.buf);
|
||
|
int data_len = ud->udata.len;
|
||
|
IPX_DATA *ipxdata = (IPX_DATA *)(ud->udata.buf);
|
||
|
DPRINTF(("DATA-LEN %d, PACKET-TYPE %d von:",
|
||
|
data_len, packet_typ));
|
||
|
/* hierin steht nun Addresse u. Node des Senders */
|
||
|
print_ipx_addr((ipxAddr_t *)(ud->addr.buf));
|
||
|
if (packet_typ == PACKT_CORE) {
|
||
|
DPRINTF(("Query Type 0x%x, Server Type 0x%xd\n",
|
||
|
GET_BE16(ipxdata->sqp.query_type),
|
||
|
GET_BE16(ipxdata->sqp.server_type)));
|
||
|
} else if (data_len > sizeof(SIP)){
|
||
|
SAP *sap = &(ipxdata->sap);
|
||
|
SAPS *saps = &(ipxdata->sap.saps);
|
||
|
int sap_operation = GET_BE16(sap->sap_operation);
|
||
|
DPRINTF(("SAP-OPERATION %d\n", sap_operation));
|
||
|
while (data_len >= sizeof(SAPS)){
|
||
|
DPRINTF(("Name:%s:, typ:0x%x\n",saps->server_name,
|
||
|
GET_BE16(saps->server_type)));
|
||
|
print_ipx_addr(&(saps->server_adr));
|
||
|
saps++;
|
||
|
data_len -= sizeof(SAPS);
|
||
|
}
|
||
|
} else print_ipx_data(ipxdata);
|
||
|
}
|
||
|
|
||
|
void print_ipx_data(IPX_DATA *p)
|
||
|
{
|
||
|
print_sip_data(&(p->sip));
|
||
|
}
|
||
|
|
||
|
void print_sip_data(SIP *sip)
|
||
|
{
|
||
|
DPRINTF(("Name:%s:,response_type:0x%x,server_typ:0x%x\n",sip->server_name,
|
||
|
GET_BE16(sip->response_type), GET_BE16(sip->server_type)));
|
||
|
print_ipx_addr(&(sip->server_adr));
|
||
|
}
|
||
|
|
||
|
void adr_to_ipx_addr(ipxAddr_t *p, char *s)
|
||
|
{
|
||
|
int net0, net1, net2, net3;
|
||
|
int node0, node1, node2, node3, node4, node5;
|
||
|
int sock0, sock1;
|
||
|
sscanf(s, "%x.%x.%x.%x,%x.%x.%x.%x.%x.%x,%x.%x",
|
||
|
&net0, &net1, &net2, &net3,
|
||
|
&node0, &node1, &node2, &node3, &node4, &node5,
|
||
|
&sock0, &sock1);
|
||
|
p->net[0] = net0;
|
||
|
p->net[1] = net1;
|
||
|
p->net[2] = net2;
|
||
|
p->net[3] = net3;
|
||
|
p->node[0] = node0;
|
||
|
p->node[1] = node1;
|
||
|
p->node[2] = node2;
|
||
|
p->node[3] = node3;
|
||
|
p->node[4] = node4;
|
||
|
p->node[5] = node5;
|
||
|
p->sock[0] = sock0;
|
||
|
p->sock[1] = sock1;
|
||
|
}
|
||
|
|
||
|
void ipx_addr_to_adr(char *s, ipxAddr_t *p)
|
||
|
{
|
||
|
sprintf(s, "%x.%x.%x.%x,%x.%x.%x.%x.%x.%x,%x.%x",
|
||
|
(int)p->net[0] ,
|
||
|
(int)p->net[1] ,
|
||
|
(int)p->net[2] ,
|
||
|
(int)p->net[3] ,
|
||
|
(int)p->node[0],
|
||
|
(int)p->node[1],
|
||
|
(int)p->node[2],
|
||
|
(int)p->node[3],
|
||
|
(int)p->node[4],
|
||
|
(int)p->node[5],
|
||
|
(int)p->sock[0],
|
||
|
(int)p->sock[1]);
|
||
|
}
|
||
|
|
||
|
|
||
|
int send_ipx_data(int fd, int pack_typ,
|
||
|
int data_len, char *data,
|
||
|
ipxAddr_t *to_addr, char *comment)
|
||
|
{
|
||
|
struct t_unitdata ud;
|
||
|
uint8 ipx_pack_typ = (uint8) pack_typ;
|
||
|
|
||
|
ud.opt.len = sizeof(ipx_pack_typ);
|
||
|
ud.opt.maxlen = sizeof(ipx_pack_typ);
|
||
|
ud.opt.buf = (char*)&ipx_pack_typ;
|
||
|
ud.addr.len = sizeof(ipxAddr_t);
|
||
|
ud.addr.maxlen = sizeof(ipxAddr_t);
|
||
|
ud.udata.buf = (char*)data;
|
||
|
ud.udata.len = data_len;
|
||
|
ud.udata.maxlen = data_len;
|
||
|
ud.addr.buf = (char*)to_addr;
|
||
|
if (comment != NULL) DPRINTF(("%s TO: ", comment));
|
||
|
if (nw_debug)print_ipx_addr(to_addr);
|
||
|
if (t_sndudata(fd, &ud) < 0){
|
||
|
t_error("t_sndudata !OK");
|
||
|
return(-1);
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|