DLPI Programmer's Guide
148 Appendix A
Sample Programs
Connection Mode
int dlsap_len; /* length of dlsap */
{
int i;
printf(”%s0x”, string);
for(i = 0; i < dlsap_len; i++) {
printf(”%02x”, dlsap[i]);
}
printf(”\n”);
}
/**************************************************************************
open the DLPI cloneable device file, get a list of available PPAs,
and attach to the first PPA; returns a file descriptor for the stream
**************************************************************************/
int
attach() {
int fd; /* file descriptor */
int ppa; /* PPA to attach to */
dl_hp_ppa_req_t *ppa_req = (dl_attach_req_t *)ctrl_area;
dl_hp_ppa_ack_t *ppa_ack = (dl_hp_ppa_ack_t *)ctrl_area;
dl_hp_ppa_info_t *ppa_info;
dl_attach_req_t *attach_req = (dl_attach_req_t *)ctrl_area;
char *mac_name;
/* open the device file */
if((fd = open(”/dev/dlpi”, O_RDWR)) == -1) {
printf(”error: open failed, errno = %d\n”, errno);
exit(1);
}
/*
find a PPA to attach to; we assume that the first PPA on the
remote is on the same media as the first local PPA
*/
/* send a PPA_REQ and wait for the PPA_ACK */
ppa_req->dl_primitive = DL_HP_PPA_REQ;
put_ctrl(fd, sizeof(dl_hp_ppa_req_t), 0);
get_msg(fd);
check_ctrl(DL_HP_PPA_ACK);
/* make sure we found at least one PPA */
if(ppa_ack->dl_length == 0) {
printf(”error: no PPAs available\n”);
exit(1);
}
/* examine the first PPA */
ppa_info = (dl_hp_ppa_info_t *)((u_char *)ctrl_area +
ppa_ack->dl_offset);
ppa = ppa_info->dl_ppa;
switch(ppa_info->dl_mac_type) {
case DL_CSMACD:
case DL_ETHER:
mac_name = ”Ethernet”;
break;
case DL_TPR:
mac_name = ”Token Ring”;
break;