#include "os.h"
#include "common/common.h"
#include "common/mopdef.h"
#include "common/device.h"
#include "common/print.h"
#include "common/get.h"
#include "common/cmp.h"
#include "common/pf.h"
#include "common/nmadef.h"
struct if_info *iflist;
void Usage(void);
void mopProcess(struct if_info *, u_char *);
struct once {
u_char eaddr[6];
struct once *next;
};
int AllFlag = 0;
int Not3Flag = 0;
int Not4Flag = 0;
int VerboseFlag = 0;
int OnceFlag = 0;
int promisc = 1;
extern char *__progname;
struct once *root = NULL;
int
main(int argc, char *argv[])
{
int op;
char *interface;
openlog(__progname, LOG_PID | LOG_CONS, LOG_DAEMON);
opterr = 0;
while ((op = getopt(argc, argv, "34aov")) != -1) {
switch (op) {
case '3':
Not3Flag = 1;
break;
case '4':
Not4Flag = 1;
break;
case 'a':
AllFlag = 1;
break;
case 'o':
OnceFlag = 1;
break;
case 'v':
VerboseFlag = 1;
break;
default:
Usage();
}
}
interface = argv[optind++];
if ((AllFlag && interface) ||
(!AllFlag && interface == 0) ||
(Not3Flag && Not4Flag))
Usage();
if (AllFlag)
deviceInitAll();
else
deviceInitOne(interface);
Loop();
}
void
Usage()
{
fprintf(stderr, "usage: %s [-3 | -4] [-aov] interface\n", __progname);
exit(1);
}
void
mopProcess(struct if_info *ii, u_char *pkt)
{
u_char *dst, *src, mopcode, tmpc, device, ilen;
u_short ptype, moplen = 0, itype;
int idx, trans, len, i, hwa = 0;
struct once *o = NULL;
trans = mopGetTrans(pkt, 0);
if ((trans == TRANS_ETHER) && Not3Flag) return;
if ((trans == TRANS_8023) && Not4Flag) return;
idx = 0;
mopGetHeader(pkt, &idx, &dst, &src, &ptype, &len, trans);
if (mopCmpEAddr(ii->eaddr,src) == 0)
return;
if (mopCmpEAddr(rc_mcst,dst) != 0) {
return;
}
switch(ptype) {
case MOP_K_PROTO_RC:
break;
default:
return;
}
if (OnceFlag) {
o = root;
while (o != NULL) {
if (mopCmpEAddr(o->eaddr,src) == 0)
return;
o = o->next;
}
o = (struct once *)malloc(sizeof(*o));
o->eaddr[0] = src[0];
o->eaddr[1] = src[1];
o->eaddr[2] = src[2];
o->eaddr[3] = src[3];
o->eaddr[4] = src[4];
o->eaddr[5] = src[5];
o->next = root;
root = o;
}
moplen = mopGetLength(pkt, trans);
mopcode = mopGetChar(pkt,&idx);
if (mopcode != MOP_K_CODE_SID) {
return;
}
mopGetChar(pkt,&idx);
mopGetShort(pkt,&idx);
device = 0;
switch(trans) {
case TRANS_ETHER:
moplen = moplen + 16;
break;
case TRANS_8023:
moplen = moplen + 14;
break;
}
itype = mopGetShort(pkt,&idx);
while (idx < (int)(moplen)) {
ilen = mopGetChar(pkt,&idx);
switch (itype) {
case 0:
tmpc = mopGetChar(pkt,&idx);
idx = idx + tmpc;
break;
case MOP_K_INFO_VER:
idx = idx + 3;
break;
case MOP_K_INFO_MFCT:
case MOP_K_INFO_RTM:
case MOP_K_INFO_CSZ:
case MOP_K_INFO_RSZ:
idx = idx + 2;
break;
case MOP_K_INFO_HWA:
hwa = idx;
case MOP_K_INFO_CNU:
idx = idx + 6;
break;
case MOP_K_INFO_TIME:
idx = idx + 10;
break;
case MOP_K_INFO_SOFD:
device = mopGetChar(pkt,&idx);
if (VerboseFlag &&
(device != NMA_C_SOFD_LCS) &&
(device != NMA_C_SOFD_DS2) &&
(device != NMA_C_SOFD_DP2) &&
(device != NMA_C_SOFD_DS3))
{
mopPrintHWA(stdout, src);
fprintf(stdout," # ");
mopPrintDevice(stdout, device);
fprintf(stdout," ");
mopPrintHWA(stdout, &pkt[hwa]);
fprintf(stdout,"\n");
}
break;
case MOP_K_INFO_SFID:
tmpc = mopGetChar(pkt,&idx);
if ((tmpc > 0) && (tmpc < 17))
idx = idx + tmpc;
break;
case MOP_K_INFO_PRTY:
idx = idx + 1;
break;
case MOP_K_INFO_DLTY:
idx = idx + 1;
break;
case MOP_K_INFO_DLBSZ:
idx = idx + 2;
break;
default:
if (((device == NMA_C_SOFD_LCS) ||
(device == NMA_C_SOFD_DS2) ||
(device == NMA_C_SOFD_DP2) ||
(device == NMA_C_SOFD_DS3)) &&
((itype > 101) && (itype < 107)))
{
switch (itype) {
case 102:
case 103:
case 106:
idx = idx + ilen;
break;
case 104:
idx = idx + 2;
break;
case 105:
mopPrintHWA(stdout, src);
fprintf(stdout," ");
for (i = 0; i < ilen; i++) {
fprintf(stdout, "%c",pkt[idx+i]);
}
idx = idx + ilen;
fprintf(stdout, "\n");
break;
};
} else {
idx = idx + ilen;
};
}
itype = mopGetShort(pkt,&idx);
}
}