DLPI Programmer's Guide
Appendix A 171
Sample Programs
Raw Mode
dl_bind(outfd, OUTSAP, addr);
pinfo.fd = outfd;
pinfo.events = POLLIN | POLLPRI;
pinfo.revents = 0;
for(i = 0; i < OUTER_LOOPS; i++) {
for(j = 0; j < INNER_LOOPS; j++) {
bcopy(addr, mac_hdr->destaddr, 6);
/* card will stuff in source addr
* The ieee header length does not include the
* ethernet MAC header.
*/
mac_hdr->length = FRAME_LEN - ETHER_HLEN;
llc_hdr->dsap = INSAP;
llc_hdr->ssap = OUTSAP;
llc_hdr->ctrl = IEEECTRL_DEF;
sprintf(&dat_area[SEQ_OFFSET], ”%d”, i * INNER_LOOPS + j);
rawdat_req->dl_primitive = DL_HP_RAWDATA_REQ;
put_both(outfd, sizeof(dl_hp_rawdata_req_t), FRAME_LEN, 0);
printf(”+”);
fflush(stdout);
if(poll(&pinfo, 1, 0)) {
get_msg(outfd);
check_ctrl(DL_ERROR_ACK);
if(err_ack->dl_error_primitive != DL_HP_RAWDATA_REQ ||
err_ack->dl_errno != DL_SYSERR ||
err_ack->dl_unix_errno != ENOBUFS) {
check_ctrl(0);
} else {
/* re-send same pkt */
printf(”\nENOBUFS\n”);
j--;
}
}
}
for(j = 0; j < INNER_LOOPS; j++) {
get_msg(infd);
printf(”-”);
fflush(stdout);
check_ctrl(DL_HP_RAWDATA_IND);
if(dat.len != FRAME_LEN) {
printf(”\nlength error: expected %d, got %d\n”,
FRAME_LEN, dat.len);
}
inseq = strtol(&dat_area[SEQ_OFFSET], 0, 0);
if(inseq != (i * INNER_LOOPS + j)) {
printf(”\nseq error: expected %d, got %d\n”,
i * INNER_LOOPS + j, inseq);
}
}
}
printf(”\n”);
}