int NSCLASS dsr_ack_req_send(struct in_addr neigh_addr, unsigned short id) { struct dsr_pkt *dp; struct dsr_ack_req_opt *ack_req; int len = DSR_OPT_HDR_LEN + DSR_ACK_REQ_HDR_LEN; char *buf; dp = dsr_pkt_alloc(NULL); dp->dst = neigh_addr; dp->nxt_hop = neigh_addr; dp->src = my_addr(); buf = dsr_pkt_alloc_opts(dp, len); if (!buf) goto out_err; dp->nh.iph = dsr_build_ip(dp, dp->src, dp->dst, IP_HDR_LEN, IP_HDR_LEN + len, IPPROTO_DSR, 1); if (!dp->nh.iph) { LOG_DBG("Could not create IP header\n"); goto out_err; } dp->dh.opth = dsr_opt_hdr_add(buf, len, DSR_NO_NEXT_HDR_TYPE); if (!dp->dh.opth) { LOG_DBG("Could not create DSR opt header\n"); goto out_err; } buf += DSR_OPT_HDR_LEN; len -= DSR_OPT_HDR_LEN; ack_req = dsr_ack_req_opt_create(buf, len, id); if (!ack_req) { LOG_DBG("Could not create ACK REQ opt\n"); goto out_err; } LOG_DBG("Sending ACK REQ for %s id=%u\n", print_ip(neigh_addr), id); XMIT(dp); return 1; out_err: dsr_pkt_free(dp); return -1; }
int NSCLASS dsr_opt_remove(struct dsr_pkt *dp) { int len, ip_len, prot, ttl; if (!dp || !dp->dh.raw) return -1; prot = dp->dh.opth->nh; #ifdef NS2 ip_len = 20; ttl = dp->nh.iph->ttl(); #else ip_len = (dp->nh.iph->ihl << 2); ttl = dp->nh.iph->ttl; #endif dsr_build_ip(dp, dp->src, dp->dst, ip_len, ip_len + dp->payload_len, prot, ttl); len = dsr_pkt_free_opts(dp); /* Return bytes removed */ return len; }
int NSCLASS dsr_ack_send(struct in_addr dst, unsigned short id) { struct dsr_pkt *dp; struct dsr_ack_opt *ack_opt; int len; char *buf; /* srt = dsr_rtc_find(my_addr(), dst); */ /* if (!srt) { */ /* LOG_DBG("No source route to %s\n", print_ip(dst.s_addr)); */ /* return -1; */ /* } */ len = DSR_OPT_HDR_LEN + /* DSR_SRT_OPT_LEN(srt) + */ DSR_ACK_HDR_LEN; dp = dsr_pkt_alloc(NULL); dp->dst = dst; /* dp->srt = srt; */ dp->nxt_hop = dst; //dsr_srt_next_hop(dp->srt, 0); dp->src = my_addr(); buf = dsr_pkt_alloc_opts(dp, len); if (!buf) goto out_err; dp->nh.iph = dsr_build_ip(dp, dp->src, dp->dst, IP_HDR_LEN, IP_HDR_LEN + len, IPPROTO_DSR, IPDEFTTL); if (!dp->nh.iph) { LOG_DBG("Could not create IP header\n"); goto out_err; } dp->dh.opth = dsr_opt_hdr_add(buf, len, DSR_NO_NEXT_HDR_TYPE); if (!dp->dh.opth) { LOG_DBG("Could not create DSR opt header\n"); goto out_err; } buf += DSR_OPT_HDR_LEN; len -= DSR_OPT_HDR_LEN; /* dp->srt_opt = dsr_srt_opt_add(buf, len, dp->srt); */ /* if (!dp->srt_opt) { */ /* LOG_DBG("Could not create Source Route option header\n"); */ /* goto out_err; */ /* } */ /* buf += DSR_SRT_OPT_LEN(dp->srt); */ /* len -= DSR_SRT_OPT_LEN(dp->srt); */ ack_opt = dsr_ack_opt_add(buf, len, dp->src, dp->dst, id); if (!ack_opt) { LOG_DBG("Could not create DSR ACK opt header\n"); goto out_err; } LOG_DBG("Sending ACK to %s id=%u\n", print_ip(dst), id); dp->flags |= PKT_XMIT_JITTER; XMIT(dp); return 1; out_err: dsr_pkt_free(dp); return -1; }
struct dsr_ack_req_opt *NSCLASS dsr_ack_req_opt_add(struct dsr_pkt *dp, unsigned short id) { char *buf = NULL; int prot = 0, tot_len = 0, ttl = IPDEFTTL; if (!dp) return NULL; /* If we are forwarding a packet and there is already an ACK REQ option, * we just overwrite the old one. */ if (dp->ack_req_opt) { buf = (char *)dp->ack_req_opt; goto end; } #ifdef NS2 if (dp->p) { hdr_cmn *cmh = HDR_CMN(dp->p); prot = cmh->ptype(); } else prot = DSR_NO_NEXT_HDR_TYPE; ttl = dp->nh.iph->ttl(); #else if (dp->nh.raw) { tot_len = ntohs(dp->nh.iph->tot_len); prot = dp->nh.iph->protocol; ttl = dp->nh.iph->ttl; } #endif if (!dsr_pkt_opts_len(dp)) { buf = dsr_pkt_alloc_opts(dp, DSR_OPT_HDR_LEN + DSR_ACK_REQ_HDR_LEN); LOG_DBG("Allocating options for ACK REQ\n"); if (!buf) return NULL; dsr_build_ip(dp, dp->src, dp->dst, IP_HDR_LEN, tot_len + DSR_OPT_HDR_LEN + DSR_ACK_REQ_HDR_LEN, IPPROTO_DSR, ttl); dp->dh.opth = dsr_opt_hdr_add(buf, DSR_OPT_HDR_LEN + DSR_ACK_REQ_HDR_LEN, prot); if (!dp->dh.opth) { return NULL; } buf += DSR_OPT_HDR_LEN; } else { buf = dsr_pkt_alloc_opts_expand(dp, DSR_ACK_REQ_HDR_LEN); LOG_DBG("Expanding options for ACK REQ p_len=%d\n", ntohs(dp->dh.opth->p_len)); if (!buf) return NULL; dsr_build_ip(dp, dp->src, dp->dst, IP_HDR_LEN, tot_len + DSR_ACK_REQ_HDR_LEN, IPPROTO_DSR, ttl); dp->dh.opth = dsr_opt_hdr_add(dp->dh.raw, DSR_OPT_HDR_LEN + ntohs(dp->dh.opth->p_len) + DSR_ACK_REQ_HDR_LEN, dp->dh.opth->nh); } LOG_DBG("Added ACK REQ option id=%u\n", id, ntohs(dp->dh.opth->p_len)); end: return dsr_ack_req_opt_create(buf, DSR_ACK_REQ_HDR_LEN, id); }