[comp.sys.sun] help writing via NIT interface

fjh@bbn.com (Frederick J. Hirsch) (10/08/90)

I am using the NIT interface and I have opened it using code that follows.
With this code in place, I can read the Ethernet packets using the *read*
command.  The problem I am having is with writing out to the NIT port.


    if((nitfds = open("/dev/nit", O_RDWR)) < 0) {
        perror("nit open");
        exit(1);
     }
    if(ioctl(nitfds, I_SRDOPT, (char *) RMSGD) < 0) {
        perror("ioctl");
        printf("unable to set up discrete messages?\n");
        exit(-1);
     }
     if(ioctl(nitfds, I_PUSH, "pf") < 0) {
        perror("ioctl");
        printf("Unable to set pf on nit port\n");
        exit(-1);
     }
  /* bind to the ether interface and set the flags */

     strncpy(ifr.ifr_name, etherif, sizeof(ifr.ifr_name));
     ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
     si.ic_cmd = NIOCBIND;
     si.ic_len = sizeof(ifr);
     si.ic_dp = (char *) &ifr;
     if(ioctl(nitfds, I_STR, (char *) &si) < 0) {
        perror("ioctl");
        printf("Unable to bind nit port\n");
        exit(-1);
     }
     flags = NI_PROMISC;
     si.ic_cmd = NIOCSFLAGS;
     si.ic_len = sizeof(flags);
     si.ic_dp = (char *) &flags;
     if(ioctl(nitfds, I_STR, (char *) &si) < 0) {
        perror("ioctl");
        printf("Unable to set flags for nit port\n");
        exit(-1);
      }

     if(ioctl(nitfds, I_FLUSH, (char *)FLUSHRW) < 0) {
        perror("ioctl");
        printf("Failed to flush\n");
        exit(-1);    
      }

Then I try to use *putmsg* to write out to the nit interface and I do not
get any error messages.  But, it is not sending any packet out because
when I monitor the ethernet with etherfind, I don't see anything.

	struct ether_addr *target;
	struct sockaddr sa;
        int offset = sizeof(sa.sa_data);
        u_char *buf = data_buf;
        struct strbuf ctl, data;

	sa.sa_family = AF_UNSPEC;
        bzero(sa.sa_data, offset);
        bcopy((char *) target, sa.sa_data, sizeof(struct ether_addr));

        ctl.maxlen = ctl.len = sizeof(sa);
        ctl.buf =  (char *)&sa;
        data.maxlen = data.len = len;
        data.buf = (char *)buf;
        if (putmsg(nitfds, &ctl, &data, 0) < 0) {
           perror("Error writing ethernet message.\n");
           exit(3);
	}


My question is how should the control and data fields in *putmsg* be set
up?  Do I need to make the control part point to a sockaddr struct which
has the family defined and the destination address defined as target in
the sockaddr data part?  I have tried to use *write* instead which didn't
give me any error messages, but didn't work either.

Any help that you could give me would be greatly appreciated.  I am
running on a Sun 3/80 with Sun OS 4.0.3.

Thanks,
Karen Pitrone
(508) 671-1323
kpitrone@bbn.com