libnet_build_ospf.c
来自「Libnet is a generic networking API that 」· C语言 代码 · 共 616 行 · 第 1/2 页
C
616 行
if (n == -1)
{
goto bad;
}
if (payload && payload_s)
{
n = libnet_pblock_append(l, p, payload, payload_s);
if (n == -1)
{
goto bad;
}
}
return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_OSPF_LSU_H));
bad:
libnet_pblock_free(p);
return (-1);
}
libnet_ptag_t
libnet_build_ospfv2_lsa(u_short age, u_char opts, u_char type, u_int lsid,
u_long advrtr, u_int seqnum, u_short sum, u_short len,
u_char *payload, u_long payload_s, libnet_t *l, libnet_ptag_t ptag)
{
u_long n;
u_short h;
libnet_pblock_t *p;
struct libnet_lsa_hdr lsa_hdr;
if (l == NULL)
{
return (-1);
}
n = LIBNET_OSPF_LSA_H + payload_s;
h = len + payload_s;
/*
* Find the existing protocol block if a ptag is specified, or create
* a new one.
*/
p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSA_H);
if (p == NULL)
{
return (-1);
}
lsa_hdr.lsa_age = htons(age);
lsa_hdr.lsa_opts = opts;
lsa_hdr.lsa_type = type;
lsa_hdr.lsa_id = htonl(lsid);
lsa_hdr.lsa_adv.s_addr = htonl(advrtr);
lsa_hdr.lsa_seq = htonl(seqnum);
lsa_hdr.lsa_cksum = sum;
lsa_hdr.lsa_len = htons(h);
n = libnet_pblock_append(l, p, (u_char *)&lsa_hdr, LIBNET_OSPF_LSA_H);
if (n == -1)
{
goto bad;
}
if (payload && payload_s)
{
n = libnet_pblock_append(l, p, payload, payload_s);
if (n == -1)
{
goto bad;
}
}
if (sum == 0)
{
/*
* If checksum is zero, by default libnet will compute a checksum
* for the user. The programmer can override this by calling
* libnet_toggle_checksum(l, ptag, 1);
*/
libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
}
return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_OSPF_LSA_H));
bad:
libnet_pblock_free(p);
return (-1);
}
libnet_ptag_t
libnet_build_ospfv2_lsa_rtr(u_short flags, u_short num, u_int id, u_int data,
u_char type, u_char tos, u_short metric, u_char *payload,
u_long payload_s, libnet_t *l, libnet_ptag_t ptag)
{
u_long n;
u_short h;
libnet_pblock_t *p;
struct libnet_rtr_lsa_hdr rtr_lsa_hdr;
if (l == NULL)
{
return (-1);
}
n = LIBNET_OSPF_LS_RTR_H + payload_s;
h = 0;
/*
* Find the existing protocol block if a ptag is specified, or create
* a new one.
*/
p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_RTR_H);
if (p == NULL)
{
return (-1);
}
rtr_lsa_hdr.rtr_flags = htons(flags);
rtr_lsa_hdr.rtr_num = htons(num);
rtr_lsa_hdr.rtr_link_id = htonl(id);
rtr_lsa_hdr.rtr_link_data = htonl(data);
rtr_lsa_hdr.rtr_type = type;
rtr_lsa_hdr.rtr_tos_num = tos;
rtr_lsa_hdr.rtr_metric = htons(metric);
n = libnet_pblock_append(l, p, (u_char *)&rtr_lsa_hdr, LIBNET_OSPF_LS_RTR_H);
if (n == -1)
{
goto bad;
}
if (payload && payload_s)
{
n = libnet_pblock_append(l, p, payload, payload_s);
if (n == -1)
{
goto bad;
}
}
return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_LS_RTR_H));
bad:
libnet_pblock_free(p);
return (-1);
}
libnet_ptag_t
libnet_build_ospfv2_lsa_net(u_long nmask, u_int rtrid, u_char *payload,
u_long payload_s, libnet_t *l, libnet_ptag_t ptag)
{
u_long n;
u_short h;
libnet_pblock_t *p;
struct libnet_net_lsa_hdr net_lsa_hdr;
if (l == NULL)
{
return (-1);
}
n = LIBNET_OSPF_LS_NET_H + payload_s;
h = 0;
/*
* Find the existing protocol block if a ptag is specified, or create
* a new one.
*/
p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_NET_H);
if (p == NULL)
{
return (-1);
}
net_lsa_hdr.net_nmask.s_addr = htonl(nmask);
net_lsa_hdr.net_rtr_id = htonl(rtrid);
n = libnet_pblock_append(l, p, (u_char *)&net_lsa_hdr, LIBNET_OSPF_LS_NET_H);
if (n == -1)
{
goto bad;
}
if (payload && payload_s)
{
n = libnet_pblock_append(l, p, payload, payload_s);
if (n == -1)
{
goto bad;
}
}
return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_LS_NET_H));
bad:
libnet_pblock_free(p);
return (-1);
}
libnet_ptag_t
libnet_build_ospfv2_lsa_sum(u_long nmask, u_int metric, u_int tos,
u_char *payload, u_long payload_s, libnet_t *l, libnet_ptag_t ptag)
{
u_long n;
u_short h;
libnet_pblock_t *p;
struct libnet_sum_lsa_hdr sum_lsa_hdr;
if (l == NULL)
{
return (-1);
}
n = LIBNET_OSPF_LS_SUM_H + payload_s;
h = 0;
/*
* Find the existing protocol block if a ptag is specified, or create
* a new one.
*/
p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_SUM_H);
if (p == NULL)
{
return (-1);
}
sum_lsa_hdr.sum_nmask.s_addr = htonl(nmask);
sum_lsa_hdr.sum_metric = htonl(metric);
sum_lsa_hdr.sum_tos_metric = htonl(tos);
n = libnet_pblock_append(l, p, (u_char *)&sum_lsa_hdr, LIBNET_OSPF_LS_SUM_H);
if (n == -1)
{
goto bad;
}
if (payload && payload_s)
{
n = libnet_pblock_append(l, p, payload, payload_s);
if (n == -1)
{
goto bad;
}
}
return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_LS_SUM_H));
bad:
libnet_pblock_free(p);
return (-1);
}
libnet_ptag_t
libnet_build_ospfv2_lsa_as(u_long nmask, u_int metric, u_long fwdaddr,
u_int tag, u_char *payload, u_long payload_s, libnet_t *l,
libnet_ptag_t ptag)
{
u_long n;
u_short h;
libnet_pblock_t *p;
struct libnet_as_lsa_hdr as_lsa_hdr;
if (l == NULL)
{
return (-1);
}
n = LIBNET_OSPF_LS_AS_EXT_H + payload_s;
h = 0;
/*
* Find the existing protocol block if a ptag is specified, or create
* a new one.
*/
p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_AS_EXT_H);
if (p == NULL)
{
return (-1);
}
as_lsa_hdr.as_nmask.s_addr = htonl(nmask);
as_lsa_hdr.as_metric = htonl(metric);
as_lsa_hdr.as_fwd_addr.s_addr = htonl(fwdaddr);
as_lsa_hdr.as_rte_tag = htonl(tag);
n = libnet_pblock_append(l, p, (u_char *)&as_lsa_hdr, LIBNET_OSPF_LS_AS_EXT_H);
if (n == -1)
{
goto bad;
}
if (payload && payload_s)
{
n = libnet_pblock_append(l, p, payload, payload_s);
if (n == -1)
{
goto bad;
}
}
return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_LS_AS_EXT_H));
bad:
libnet_pblock_free(p);
return (-1);
}
/* EOF */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?