⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libnet_link_dlpi.c

📁 tcp数据流重放工具
💻 C
📖 第 1 页 / 共 2 页
字号:
static intdlbindreq(int fd, bpf_u_int32 sap, int8_t *ebuf){    dl_bind_req_t	req;    memset((int8_t *)&req, 0, sizeof(req));    req.dl_primitive = DL_BIND_REQ;#ifdef DL_HP_RAWDLS    req.dl_max_conind = 1;  /* XXX magic number */    /*     *  22 is INSAP as per the HP-UX DLPI Programmer's Guide     */    req.dl_sap = 22;    req.dl_service_mode = DL_HP_RAWDLS;#else    req.dl_sap = sap;#ifdef DL_CLDLS    req.dl_service_mode = DL_CLDLS;#endif#endif    return (send_request(fd, (int8_t *)&req, sizeof(req), "bind", ebuf, 0));}static intdlbindack(int fd, int8_t *bufp, int8_t *ebuf){    return (recv_ack(fd, DL_BIND_ACK_SIZE, "bind", bufp, ebuf));}static intdlokack(int fd, const int8_t *what, int8_t *bufp, int8_t *ebuf){    return (recv_ack(fd, DL_OK_ACK_SIZE, what, bufp, ebuf));}static intdlinforeq(int fd, int8_t *ebuf){    dl_info_req_t req;    req.dl_primitive = DL_INFO_REQ;    return (send_request(fd, (int8_t *)&req, sizeof(req), "info", ebuf, RS_HIPRI));}static intdlinfoack(int fd, int8_t *bufp, int8_t *ebuf){    return (recv_ack(fd, DL_INFO_ACK_SIZE, "info", bufp, ebuf));}#ifdef HAVE_SYS_BUFMOD_Hstatic intstrioctl(int fd, int cmd, int len, int8_t *dp){    struct strioctl str;    int rc;    str.ic_cmd    = cmd;    str.ic_timout = -1;    str.ic_len    = len;    str.ic_dp     = dp;        rc = ioctl(fd, I_STR, &str);    if (rc < 0)    {        return (rc);    }    else    {        return (str.ic_len);    }}#endif#if (defined(DL_HP_PPA_ACK_OBS) && !defined(HAVE_HPUX11))/* * Under HP-UX 10, we can ask for the ppa */static intget_dlpi_ppa(register int fd, register const int8_t *device, register int unit,    register int8_t *ebuf){    register dl_hp_ppa_ack_t *ap;    register dl_hp_ppa_info_t *ip;    register int i;    register u_int32_t majdev;    dl_hp_ppa_req_t	req;    struct stat statbuf;    bpf_u_int32 buf[MAXDLBUF];    if (stat(device, &statbuf) < 0)    {        sprintf(ebuf, "stat: %s: %s", device, strerror(errno));        return (-1);    }    majdev = major(statbuf.st_rdev);    memset((int8_t *)&req, 0, sizeof(req));    req.dl_primitive = DL_HP_PPA_REQ;    memset((int8_t *)buf, 0, sizeof(buf));    if (send_request(fd, (int8_t *)&req, sizeof(req), "hpppa", ebuf, 0) < 0 ||        recv_ack(fd, DL_HP_PPA_ACK_SIZE, "hpppa", (int8_t *)buf, ebuf) < 0)    {        return (-1);    }    ap = (dl_hp_ppa_ack_t *)buf;    ip = (dl_hp_ppa_info_t *)((u_int8_t *)ap + ap->dl_offset);    for (i = 0; i < ap->dl_count; i++)    {        if (ip->dl_mjr_num == majdev && ip->dl_instance_num == unit)        break;        ip = (dl_hp_ppa_info_t *)((u_int8_t *)ip + ip->dl_next_offset);    }    if (i == ap->dl_count)    {        sprintf(ebuf, "can't find PPA for %s", device);        return (-1);    }    if (ip->dl_hdw_state == HDW_DEAD)    {        sprintf(ebuf, "%s: hardware state: DOWN\n", device);        return (-1);    }    return ((int)ip->dl_ppa);}#endif#ifdef HAVE_HPUX9/* * Under HP-UX 9, there is no good way to determine the ppa. * So punt and read it from /dev/kmem. */static struct nlist nl[] ={#define NL_IFNET 0    { "ifnet" },    { "" }};static int8_t path_vmunix[] = "/hp-ux";/* *  Determine ppa number that specifies ifname */static intget_dlpi_ppa(register int fd, register const int8_t *ifname, register int unit,    register int8_t *ebuf){    register const int8_t *cp;    register int kd;    void *addr;    struct ifnet ifnet;    int8_t if_name[sizeof(ifnet.if_name)], tifname[32];    cp = strrchr(ifname, '/');    if (cp != NULL)    {        ifname = cp + 1;    }    if (nlist(path_vmunix, &nl) < 0)    {        sprintf(ebuf, "nlist %s failed", path_vmunix);        return (-1);    }    if (nl[NL_IFNET].n_value == 0)    {        sprintf(ebuf, "could't find %s kernel symbol", nl[NL_IFNET].n_name);        return (-1);    }    kd = open("/dev/kmem", O_RDONLY);    if (kd < 0)    {        sprintf(ebuf, "kmem open: %s", strerror(errno));        return (-1);    }    if (dlpi_kread(kd, nl[NL_IFNET].n_value, &addr, sizeof(addr), ebuf) < 0)    {        close(kd);        return (-1);    }    for (; addr != NULL; addr = ifnet.if_next)    {        if (dlpi_kread(kd, (off_t)addr, &ifnet, sizeof(ifnet), ebuf) < 0 ||            dlpi_kread(kd, (off_t)ifnet.if_name,            if_name, sizeof(if_name), ebuf) < 0)            {                close(kd);                return (-1);            }            sprintf(tifname, "%.*s%d",                (int)sizeof(if_name), if_name, ifnet.if_unit);            if (strcmp(tifname, ifname) == 0)            {                return (ifnet.if_index);            }    }    sprintf(ebuf, "Can't find %s", ifname);    return (-1);}static intdlpi_kread(register int fd, register off_t addr,    register void *buf, register u_int len, register int8_t *ebuf){    register int cc;    if (lseek(fd, addr, SEEK_SET) < 0)    {        sprintf(ebuf, "lseek: %s", strerror(errno));        return (-1);    }    cc = read(fd, buf, len);    if (cc < 0)    {        sprintf(ebuf, "read: %s", strerror(errno));        return (-1);    }    else if (cc != len)    {        sprintf(ebuf, "int16_t read (%d != %d)", cc, len);        return (-1);    }    return (cc);}#endif#define ETHERADDRL 6struct  EnetHeaderInfo{    struct libnet_ether_addr   DestEtherAddr;    u_int16_t EtherFrameType;};intlibnet_close_link(libnet_t *l){    if (close(l->fd) == 0)    {        free(l);        return (1);    }    else    {        free(l);        return (-1);    }}struct EnetHeaderInfo ArpHeader ={    {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, ETHERTYPE_ARP};#ifdef HAVE_HPUX11int libnet_write_link(libnet_t *l, u_int8_t *packet, u_int32_t size)   {                                                                 struct strbuf data, ctl;    dl_hp_rawdata_req_t *rdata;    int c;                                                   if (l == NULL)    {                     return (-1);               }                       rdata = (dl_hp_rawdata_req_t *)ctlbuf;    rdata->dl_primitive = DL_HP_RAWDATA_REQ;     /* send it */                                      ctl.len = sizeof(dl_hp_rawdata_req_t);                             ctl.maxlen = sizeof(dl_hp_rawdata_req_t);                          ctl.buf = (int8_t *)rdata;    data.maxlen = size;    data.len    = size;                                    data.buf    = packet;      c = putmsg(l->fd, &ctl, &data, 0);    if (c == -1)                          {                            snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,                "libnet_write_link(): %d bytes written (%s)\n", c,                strerror(errno));        return (-1);    }    else    {        return (size);    }                }   #elseintlibnet_write_link(libnet_t *l, u_int8_t *packet, u_int32_t size){    struct strbuf data, ctl;    union DL_primitives *dlp;    int c;    struct EnetHeaderInfo *EnetHeaderInfoP;    if (l == NULL)    {         return (-1);    }     dlp = (union DL_primitives*) ctlbuf;    dlp->unitdata_req.dl_primitive        = DL_UNITDATA_REQ;    dlp->unitdata_req.dl_priority.dl_min  = 0;    dlp->unitdata_req.dl_priority.dl_max  = 0;    dlp->unitdata_req.dl_dest_addr_length =             (sizeof (struct libnet_ether_addr) + sizeof(u_int16_t));    dlp->unitdata_req.dl_dest_addr_offset = DL_UNITDATA_REQ_SIZE;    EnetHeaderInfoP = (struct EnetHeaderInfo *)(ctlbuf + DL_UNITDATA_REQ_SIZE);    memcpy(EnetHeaderInfoP, (int8_t *)&(ArpHeader),            (sizeof (struct libnet_ether_addr) + sizeof(u_int16_t)));    /* Send it */    ctl.len = DL_UNITDATA_REQ_SIZE + sizeof (struct EnetHeaderInfo);    ctl.buf = (int8_t *)dlp;    data.maxlen = size;    data.len    = size;    data.buf    = packet;    c = putmsg(l->fd, NULL, &data, 0);    if (c == -1)    {        snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,                "libnet_write_link: %d bytes written (%s)\n", c,                strerror(errno));        return (-1);    }    else    {        return (size);    }}#endifstruct libnet_ether_addr *libnet_get_hwaddr(libnet_t *l){    int8_t buf[2048];    union DL_primitives *dlp;    struct libnet_ether_addr *eap;    if (l == NULL)    {         return (NULL);    }    dlp = (union DL_primitives *)buf;    dlp->physaddr_req.dl_primitive = DL_PHYS_ADDR_REQ;    dlp->physaddr_req.dl_addr_type = DL_CURR_PHYS_ADDR;    if (send_request(l->fd, (int8_t *)dlp, DL_PHYS_ADDR_REQ_SIZE, "physaddr",            l->err_buf, 0) < 0)    {        return (NULL);    }    if (recv_ack(l->fd, DL_PHYS_ADDR_ACK_SIZE, "physaddr", (int8_t *)dlp,            l->err_buf) < 0)    {        return (NULL);    }    eap = (struct libnet_ether_addr *)            ((int8_t *) dlp + dlp->physaddr_ack.dl_addr_offset);    return (eap);}   /* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -