DLPI Programmer's Guide

150 Appendix A
Sample Programs
Connection Mode
/* send the BIND_REQ and wait for the OK_ACK */
put_ctrl(fd, sizeof(dl_bind_req_t), 0);
get_msg(fd);
check_ctrl(DL_BIND_ACK);
/* return the DLSAP to the caller */
*dlsap_len = bind_ack->dl_addr_length;
dlsap_addr = (u_char *)ctrl_area + bind_ack->dl_addr_offset;
memcpy(dlsap, dlsap_addr, *dlsap_len);
}
/**************************************************************************
unbind, detach, and close
**************************************************************************/
void
cleanup(fd)
int fd; /* file descriptor */
{
dl_unbind_req_t *unbind_req = (dl_unbind_req_t *)ctrl_area;
dl_detach_req_t *detach_req = (dl_detach_req_t *)ctrl_area;
/* unbind */
unbind_req->dl_primitive = DL_UNBIND_REQ;
put_ctrl(fd, sizeof(dl_unbind_req_t), 0);
get_msg(fd);
check_ctrl(DL_OK_ACK);
/* detach */
detach_req->dl_primitive = DL_DETACH_REQ;
put_ctrl(fd, sizeof(dl_detach_req_t), 0);
get_msg(fd);
check_ctrl(DL_OK_ACK);
/* close */
close(fd);
}
/**************************************************************************
send a connect request to a DLSAP
**************************************************************************/
void
connect_req(fd, dlsap, dlsap_len)
int fd; /* file descriptor */
u_char *dlsap; /* DLSAP to connect with */
int dlsap_len; /* length of dlsap */
{
dl_connect_req_t *con_req = (dl_connect_req_t *)ctrl_area;
dl_connect_res_t *con_res = (dl_connect_res_t *)ctrl_area;
u_char *tdlsap;
/* fill in the connect request */
con_req->dl_primitive = DL_CONNECT_REQ;
con_req->dl_dest_addr_length = dlsap_len;
con_req->dl_dest_addr_offset = sizeof(dl_connect_req_t);
/* QOS is not supported; these fields must be set to zero */
con_req->dl_qos_length = 0;
con_req->dl_qos_offset = 0;