Annotation of embedaddon/libnet/src/libnet_build_ospf.c, revision 1.1.1.1
1.1 misho 1: /*
2: * $Id: libnet_build_ospf.c,v 1.10 2004/03/01 20:26:12 mike Exp $
3: *
4: * libnet
5: * libnet_build_ospf.c - OSPF packet assembler
6: *
7: * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8: * All rights reserved.
9: *
10: * Copyright (c) 1999, 2000 Andrew Reiter <areiter@bindview.com>
11: * Bindview Development
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32: * SUCH DAMAGE.
33: *
34: */
35:
36: #if (HAVE_CONFIG_H)
37: #include "../include/config.h"
38: #endif
39: #if (!(_WIN32) || (__CYGWIN__))
40: #include "../include/libnet.h"
41: #else
42: #include "../include/win32/libnet.h"
43: #endif
44:
45: libnet_ptag_t
46: libnet_build_ospfv2(u_int16_t len, u_int8_t type, u_int32_t rtr_id,
47: u_int32_t area_id, u_int16_t sum, u_int16_t autype, u_int8_t *payload,
48: u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
49: {
50: u_int32_t n, h;
51: libnet_pblock_t *p;
52: struct libnet_ospf_hdr ospf_hdr;
53:
54: if (l == NULL)
55: {
56: return (-1);
57: }
58:
59: n = LIBNET_OSPF_H + payload_s;
60: h = LIBNET_OSPF_H + payload_s + len;
61:
62: /*
63: * Find the existing protocol block if a ptag is specified, or create
64: * a new one.
65: */
66: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_H);
67: if (p == NULL)
68: {
69: return (-1);
70: }
71:
72: memset(&ospf_hdr, 0, sizeof(ospf_hdr));
73: ospf_hdr.ospf_v = 2; /* OSPF version 2 */
74: ospf_hdr.ospf_type = type; /* Type of pkt */
75: ospf_hdr.ospf_len = htons(h); /* Pkt len */
76: ospf_hdr.ospf_rtr_id.s_addr = htonl(rtr_id); /* Router ID */
77: ospf_hdr.ospf_area_id.s_addr = htonl(area_id); /* Area ID */
78: ospf_hdr.ospf_sum = (sum ? htons(sum) : 0);
79: ospf_hdr.ospf_auth_type = htons(autype); /* Type of auth */
80:
81: n = libnet_pblock_append(l, p, (u_int8_t *)&ospf_hdr, LIBNET_OSPF_H);
82: if (n == -1)
83: {
84: goto bad;
85: }
86:
87: if ((payload && !payload_s) || (!payload && payload_s))
88: {
89: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
90: "%s(): payload inconsistency\n", __func__);
91: goto bad;
92: }
93:
94: if (payload && payload_s)
95: {
96: n = libnet_pblock_append(l, p, payload, payload_s);
97: if (n == -1)
98: {
99: goto bad;
100: }
101: }
102:
103: if (sum == 0)
104: {
105: /*
106: * If checksum is zero, by default libnet will compute a checksum
107: * for the user. The programmer can override this by calling
108: * libnet_toggle_checksum(l, ptag, 1);
109: */
110: libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
111: }
112: return (ptag ? ptag : libnet_pblock_update(l, p, h, LIBNET_PBLOCK_OSPF_H));
113: bad:
114: libnet_pblock_delete(l, p);
115: return (-1);
116: }
117:
118:
119: libnet_ptag_t
120: libnet_build_ospfv2_hello(u_int32_t netmask, u_int16_t interval, u_int8_t opts,
121: u_int8_t priority, u_int32_t dead_int, u_int32_t des_rtr, u_int32_t bkup_rtr,
122: u_int32_t neighbor, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
123: libnet_ptag_t ptag)
124: {
125: u_int32_t n, h;
126: libnet_pblock_t *p;
127: struct libnet_ospf_hello_hdr hello_hdr;
128:
129: if (l == NULL)
130: {
131: return (-1);
132: }
133:
134: n = LIBNET_OSPF_HELLO_H + payload_s;
135: h = 0;
136:
137: /*
138: * Find the existing protocol block if a ptag is specified, or create
139: * a new one.
140: */
141: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_HELLO_H);
142: if (p == NULL)
143: {
144: return (-1);
145: }
146:
147: memset(&hello_hdr, 0, sizeof(hello_hdr));
148: hello_hdr.hello_nmask.s_addr = htonl(netmask); /* Netmask */
149: hello_hdr.hello_intrvl = htons(interval); /* # seconds since last packet sent */
150: hello_hdr.hello_opts = opts; /* OSPF_* options */
151: hello_hdr.hello_rtr_pri = priority; /* If 0, can't be backup */
152: hello_hdr.hello_dead_intvl = htonl(dead_int); /* Time til router is deemed down */
153: hello_hdr.hello_des_rtr.s_addr = htonl(des_rtr); /* Networks designated router */
154: hello_hdr.hello_bkup_rtr.s_addr = htonl(bkup_rtr); /* Networks backup router */
155: hello_hdr.hello_nbr.s_addr = htonl(neighbor);
156:
157: n = libnet_pblock_append(l, p, (u_int8_t *)&hello_hdr, LIBNET_OSPF_HELLO_H);
158: if (n == -1)
159: {
160: goto bad;
161: }
162:
163: if ((payload && !payload_s) || (!payload && payload_s))
164: {
165: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
166: "%s(): payload inconsistency\n", __func__);
167: goto bad;
168: }
169:
170: if (payload && payload_s)
171: {
172: n = libnet_pblock_append(l, p, payload, payload_s);
173: if (n == -1)
174: {
175: goto bad;
176: }
177: }
178:
179: return (ptag ? ptag : libnet_pblock_update(l, p, h,
180: LIBNET_PBLOCK_OSPF_HELLO_H));
181: bad:
182: libnet_pblock_delete(l, p);
183: return (-1);
184: }
185:
186:
187: libnet_ptag_t
188: libnet_build_ospfv2_dbd(u_int16_t dgram_len, u_int8_t opts, u_int8_t type,
189: u_int32_t seqnum, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
190: libnet_ptag_t ptag)
191: {
192: u_int32_t n, h;
193: libnet_pblock_t *p;
194: struct libnet_dbd_hdr dbd_hdr;
195:
196: if (l == NULL)
197: {
198: return (-1);
199: }
200:
201: n = LIBNET_OSPF_DBD_H + payload_s;
202: h = 0;
203:
204: /*
205: * Find the existing protocol block if a ptag is specified, or create
206: * a new one.
207: */
208: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_DBD_H);
209: if (p == NULL)
210: {
211: return (-1);
212: }
213:
214: memset(&dbd_hdr, 0, sizeof(dbd_hdr));
215: dbd_hdr.dbd_mtu_len = htons(dgram_len); /* Max length of IP packet IF can use */
216: dbd_hdr.dbd_opts = opts; /* OSPF_* options */
217: dbd_hdr.dbd_type = type; /* Type of exchange occuring */
218: dbd_hdr.dbd_seq = htonl(seqnum); /* DBD sequence number */
219:
220: n = libnet_pblock_append(l, p, (u_int8_t *)&dbd_hdr, LIBNET_OSPF_DBD_H);
221: if (n == -1)
222: {
223: goto bad;
224: }
225:
226: if ((payload && !payload_s) || (!payload && payload_s))
227: {
228: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
229: "%s(): payload inconsistency\n", __func__);
230: goto bad;
231: }
232:
233: if (payload && payload_s)
234: {
235: n = libnet_pblock_append(l, p, payload, payload_s);
236: if (n == -1)
237: {
238: goto bad;
239: }
240: }
241:
242: return (ptag ? ptag : libnet_pblock_update(l, p, h,
243: LIBNET_PBLOCK_OSPF_DBD_H));
244: bad:
245: libnet_pblock_delete(l, p);
246: return (-1);
247: }
248:
249:
250: libnet_ptag_t
251: libnet_build_ospfv2_lsr(u_int32_t type, u_int lsid, u_int32_t advrtr,
252: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
253: {
254: u_int32_t n, h;
255: libnet_pblock_t *p;
256: struct libnet_lsr_hdr lsr_hdr;
257:
258: if (l == NULL)
259: {
260: return (-1);
261: }
262:
263: n = LIBNET_OSPF_LSR_H + payload_s;
264: h = 0;
265:
266: /*
267: * Find the existing protocol block if a ptag is specified, or create
268: * a new one.
269: */
270: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSR_H);
271: if (p == NULL)
272: {
273: return (-1);
274: }
275:
276: memset(&lsr_hdr, 0, sizeof(lsr_hdr));
277: lsr_hdr.lsr_type = htonl(type); /* Type of LS being requested */
278: lsr_hdr.lsr_lsid = htonl(lsid); /* Link State ID */
279: lsr_hdr.lsr_adrtr.s_addr = htonl(advrtr); /* Advertising router */
280:
281: n = libnet_pblock_append(l, p, (u_int8_t *)&lsr_hdr, LIBNET_OSPF_LSR_H);
282: if (n == -1)
283: {
284: goto bad;
285: }
286:
287: if ((payload && !payload_s) || (!payload && payload_s))
288: {
289: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
290: "%s(): payload inconsistency\n", __func__);
291: goto bad;
292: }
293:
294: if (payload && payload_s)
295: {
296: n = libnet_pblock_append(l, p, payload, payload_s);
297: if (n == -1)
298: {
299: goto bad;
300: }
301: }
302:
303: return (ptag ? ptag : libnet_pblock_update(l, p, h,
304: LIBNET_PBLOCK_OSPF_LSR_H));
305: bad:
306: libnet_pblock_delete(l, p);
307: return (-1);
308: }
309:
310:
311: libnet_ptag_t
312: libnet_build_ospfv2_lsu(u_int32_t num, u_int8_t *payload, u_int32_t payload_s,
313: libnet_t *l, libnet_ptag_t ptag)
314: {
315: u_int32_t n, h;
316: libnet_pblock_t *p;
317: struct libnet_lsu_hdr lh_hdr;
318:
319: if (l == NULL)
320: {
321: return (-1);
322: }
323:
324: n = LIBNET_OSPF_LSU_H + payload_s;
325: h = 0;
326:
327: /*
328: * Find the existing protocol block if a ptag is specified, or create
329: * a new one.
330: */
331: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSU_H);
332: if (p == NULL)
333: {
334: return (-1);
335: }
336:
337: memset(&lh_hdr, 0, sizeof(lh_hdr));
338: lh_hdr.lsu_num = htonl(num); /* Number of LSAs that will be bcasted */
339:
340: n = libnet_pblock_append(l, p, (u_int8_t *)&lh_hdr, LIBNET_OSPF_LSU_H);
341: if (n == -1)
342: {
343: goto bad;
344: }
345:
346: if ((payload && !payload_s) || (!payload && payload_s))
347: {
348: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
349: "%s(): payload inconsistency\n", __func__);
350: goto bad;
351: }
352:
353: if (payload && payload_s)
354: {
355: n = libnet_pblock_append(l, p, payload, payload_s);
356: if (n == -1)
357: {
358: goto bad;
359: }
360: }
361:
362: return (ptag ? ptag : libnet_pblock_update(l, p, h,
363: LIBNET_PBLOCK_OSPF_LSU_H));
364: bad:
365: libnet_pblock_delete(l, p);
366: return (-1);
367: }
368:
369:
370: libnet_ptag_t
371: libnet_build_ospfv2_lsa(u_int16_t age, u_int8_t opts, u_int8_t type, u_int lsid,
372: u_int32_t advrtr, u_int32_t seqnum, u_int16_t sum, u_int16_t len,
373: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
374: {
375: u_int32_t n, h;
376: libnet_pblock_t *p;
377: struct libnet_lsa_hdr lsa_hdr;
378:
379: if (l == NULL)
380: {
381: return (-1);
382: }
383:
384: n = LIBNET_OSPF_LSA_H + payload_s;
385: h = len + payload_s;
386:
387: /*
388: * Find the existing protocol block if a ptag is specified, or create
389: * a new one.
390: */
391: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_OSPF_LSA_H);
392: if (p == NULL)
393: {
394: return (-1);
395: }
396:
397: memset(&lsa_hdr, 0, sizeof(lsa_hdr));
398: lsa_hdr.lsa_age = htons(age);
399: lsa_hdr.lsa_opts = opts;
400: lsa_hdr.lsa_type = type;
401: lsa_hdr.lsa_id = htonl(lsid);
402: lsa_hdr.lsa_adv.s_addr = htonl(advrtr);
403: lsa_hdr.lsa_seq = htonl(seqnum);
404: lsa_hdr.lsa_sum = (sum ? htons(sum) : 0);
405: lsa_hdr.lsa_len = htons(h);
406:
407: n = libnet_pblock_append(l, p, (u_int8_t *)&lsa_hdr, LIBNET_OSPF_LSA_H);
408: if (n == -1)
409: {
410: goto bad;
411: }
412:
413: if ((payload && !payload_s) || (!payload && payload_s))
414: {
415: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
416: "%s(): payload inconsistency\n", __func__);
417: goto bad;
418: }
419:
420: if (payload && payload_s)
421: {
422: n = libnet_pblock_append(l, p, payload, payload_s);
423: if (n == -1)
424: {
425: goto bad;
426: }
427: }
428:
429: if (sum == 0)
430: {
431: /*
432: * If checksum is zero, by default libnet will compute a checksum
433: * for the user. The programmer can override this by calling
434: * libnet_toggle_checksum(l, ptag, 1);
435: */
436: libnet_pblock_setflags(p, LIBNET_PBLOCK_DO_CHECKSUM);
437: }
438: return (ptag ? ptag : libnet_pblock_update(l, p, h,
439: LIBNET_PBLOCK_OSPF_LSA_H));
440: bad:
441: libnet_pblock_delete(l, p);
442: return (-1);
443: }
444:
445:
446: libnet_ptag_t
447: libnet_build_ospfv2_lsa_rtr(u_int16_t flags, u_int16_t num, u_int32_t id,
448: u_int32_t data, u_int8_t type, u_int8_t tos, u_int16_t metric,
449: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
450: {
451: u_int32_t n, h;
452: libnet_pblock_t *p;
453: struct libnet_rtr_lsa_hdr rtr_lsa_hdr;
454:
455: if (l == NULL)
456: {
457: return (-1);
458: }
459:
460: n = LIBNET_OSPF_LS_RTR_H + payload_s;
461: h = 0;
462:
463: /*
464: * Find the existing protocol block if a ptag is specified, or create
465: * a new one.
466: */
467: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_RTR_H);
468: if (p == NULL)
469: {
470: return (-1);
471: }
472:
473: memset(&rtr_lsa_hdr, 0, sizeof(rtr_lsa_hdr));
474: rtr_lsa_hdr.rtr_flags = htons(flags);
475: rtr_lsa_hdr.rtr_num = htons(num);
476: rtr_lsa_hdr.rtr_link_id = htonl(id);
477: rtr_lsa_hdr.rtr_link_data = htonl(data);
478: rtr_lsa_hdr.rtr_type = type;
479: rtr_lsa_hdr.rtr_tos_num = tos;
480: rtr_lsa_hdr.rtr_metric = htons(metric);
481:
482: n = libnet_pblock_append(l, p, (u_int8_t *)&rtr_lsa_hdr,
483: LIBNET_OSPF_LS_RTR_H);
484: if (n == -1)
485: {
486: goto bad;
487: }
488:
489: if ((payload && !payload_s) || (!payload && payload_s))
490: {
491: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
492: "%s(): payload inconsistency\n", __func__);
493: goto bad;
494: }
495:
496: if (payload && payload_s)
497: {
498: n = libnet_pblock_append(l, p, payload, payload_s);
499: if (n == -1)
500: {
501: goto bad;
502: }
503: }
504:
505: return (ptag ? ptag : libnet_pblock_update(l, p, h,
506: LIBNET_PBLOCK_LS_RTR_H));
507: bad:
508: libnet_pblock_delete(l, p);
509: return (-1);
510: }
511:
512:
513: libnet_ptag_t
514: libnet_build_ospfv2_lsa_net(u_int32_t nmask, u_int32_t rtrid,
515: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
516: {
517: u_int32_t n, h;
518: libnet_pblock_t *p;
519: struct libnet_net_lsa_hdr net_lsa_hdr;
520:
521: if (l == NULL)
522: {
523: return (-1);
524: }
525:
526: n = LIBNET_OSPF_LS_NET_H + payload_s;
527: h = 0;
528:
529: /*
530: * Find the existing protocol block if a ptag is specified, or create
531: * a new one.
532: */
533: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_NET_H);
534: if (p == NULL)
535: {
536: return (-1);
537: }
538:
539: memset(&net_lsa_hdr, 0, sizeof(net_lsa_hdr));
540: net_lsa_hdr.net_nmask.s_addr = htonl(nmask);
541: net_lsa_hdr.net_rtr_id = htonl(rtrid);
542:
543: n = libnet_pblock_append(l, p, (u_int8_t *)&net_lsa_hdr,
544: LIBNET_OSPF_LS_NET_H);
545: if (n == -1)
546: {
547: goto bad;
548: }
549:
550: if ((payload && !payload_s) || (!payload && payload_s))
551: {
552: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
553: "%s(): payload inconsistency\n", __func__);
554: goto bad;
555: }
556:
557: if (payload && payload_s)
558: {
559: n = libnet_pblock_append(l, p, payload, payload_s);
560: if (n == -1)
561: {
562: goto bad;
563: }
564: }
565:
566: return (ptag ? ptag : libnet_pblock_update(l, p, h,
567: LIBNET_PBLOCK_LS_NET_H));
568: bad:
569: libnet_pblock_delete(l, p);
570: return (-1);
571: }
572:
573:
574: libnet_ptag_t
575: libnet_build_ospfv2_lsa_sum(u_int32_t nmask, u_int32_t metric, u_int tos,
576: u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
577: {
578: u_int32_t n, h;
579: libnet_pblock_t *p;
580: struct libnet_sum_lsa_hdr sum_lsa_hdr;
581:
582: if (l == NULL)
583: {
584: return (-1);
585: }
586:
587: n = LIBNET_OSPF_LS_SUM_H + payload_s;
588: h = 0;
589:
590: /*
591: * Find the existing protocol block if a ptag is specified, or create
592: * a new one.
593: */
594: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_SUM_H);
595: if (p == NULL)
596: {
597: return (-1);
598: }
599:
600: memset(&sum_lsa_hdr, 0, sizeof(sum_lsa_hdr));
601: sum_lsa_hdr.sum_nmask.s_addr = htonl(nmask);
602: sum_lsa_hdr.sum_metric = htonl(metric);
603: sum_lsa_hdr.sum_tos_metric = htonl(tos);
604:
605: n = libnet_pblock_append(l, p, (u_int8_t *)&sum_lsa_hdr,
606: LIBNET_OSPF_LS_SUM_H);
607: if (n == -1)
608: {
609: goto bad;
610: }
611:
612: if ((payload && !payload_s) || (!payload && payload_s))
613: {
614: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
615: "%s(): payload inconsistency\n", __func__);
616: goto bad;
617: }
618:
619: if (payload && payload_s)
620: {
621: n = libnet_pblock_append(l, p, payload, payload_s);
622: if (n == -1)
623: {
624: goto bad;
625: }
626: }
627:
628: return (ptag ? ptag : libnet_pblock_update(l, p, h,
629: LIBNET_PBLOCK_LS_SUM_H));
630: bad:
631: libnet_pblock_delete(l, p);
632: return (-1);
633: }
634:
635:
636: libnet_ptag_t
637: libnet_build_ospfv2_lsa_as(u_int32_t nmask, u_int metric, u_int32_t fwdaddr,
638: u_int32_t tag, u_int8_t *payload, u_int32_t payload_s, libnet_t *l,
639: libnet_ptag_t ptag)
640: {
641: u_int32_t n, h;
642: libnet_pblock_t *p;
643: struct libnet_as_lsa_hdr as_lsa_hdr;
644:
645: if (l == NULL)
646: {
647: return (-1);
648: }
649:
650: n = LIBNET_OSPF_LS_AS_EXT_H + payload_s;
651: h = 0;
652:
653: /*
654: * Find the existing protocol block if a ptag is specified, or create
655: * a new one.
656: */
657: p = libnet_pblock_probe(l, ptag, n, LIBNET_PBLOCK_LS_AS_EXT_H);
658: if (p == NULL)
659: {
660: return (-1);
661: }
662:
663: memset(&as_lsa_hdr, 0, sizeof(as_lsa_hdr));
664: as_lsa_hdr.as_nmask.s_addr = htonl(nmask);
665: as_lsa_hdr.as_metric = htonl(metric);
666: as_lsa_hdr.as_fwd_addr.s_addr = htonl(fwdaddr);
667: as_lsa_hdr.as_rte_tag = htonl(tag);
668:
669: n = libnet_pblock_append(l, p, (u_int8_t *)&as_lsa_hdr,
670: LIBNET_OSPF_LS_AS_EXT_H);
671: if (n == -1)
672: {
673: goto bad;
674: }
675:
676: if ((payload && !payload_s) || (!payload && payload_s))
677: {
678: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
679: "%s(): payload inconsistency\n", __func__);
680: goto bad;
681: }
682:
683: if (payload && payload_s)
684: {
685: n = libnet_pblock_append(l, p, payload, payload_s);
686: if (n == -1)
687: {
688: goto bad;
689: }
690: }
691:
692: return (ptag ? ptag : libnet_pblock_update(l, p, h,
693: LIBNET_PBLOCK_LS_AS_EXT_H));
694: bad:
695: libnet_pblock_delete(l, p);
696: return (-1);
697: }
698:
699: /* EOF */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>