static unsigned char * agent_set_rewrite(struct vr_interface *vif, struct vr_packet *pkt, unsigned char *rewrite, unsigned short len) { unsigned char *head; unsigned int hdr_len; struct agent_hdr *hdr; vr_preset(pkt); hdr_len = sizeof(struct agent_hdr) + len; if (pkt_head_space(pkt) < hdr_len) { pkt = vr_pexpand_head(pkt, hdr_len - pkt_head_space(pkt)); if (!pkt) return NULL; } head = pkt_push(pkt, hdr_len); if (!head) return NULL; /* copy the rewrite first */ memcpy(head, rewrite, len); hdr = (struct agent_hdr *)(head + len); hdr->hdr_ifindex = htons(pkt->vp_if->vif_idx); hdr->hdr_vrf = htons(pkt->vp_if->vif_vrf); /* this needs some thought */ hdr->hdr_cmd = htons(AGENT_TRAP_NEXTHOP); hdr->hdr_cmd_param = 0; return head; }
/* * in the rewrite case, we will assume the positive case of caller * passing us valid rewrite ptr and len and will not check for those */ static unsigned char * vif_cmn_rewrite(struct vr_interface *vif, struct vr_packet *pkt, unsigned char *rewrite, unsigned short len) { unsigned char *head; if (pkt_head_space(pkt) < len) { pkt = vr_pexpand_head(pkt, len - pkt_head_space(pkt)); if (!pkt) return NULL; } head = pkt_push(pkt, len); if (!head) return NULL; memcpy(head, rewrite, len); return head; }
bool vr_l2_mcast_control_data_add(struct vr_packet *pkt) { unsigned int *data; if (pkt_head_space(pkt) < VR_L2_MCAST_CTRL_DATA_LEN) { pkt = vr_pexpand_head(pkt, VR_L2_MCAST_CTRL_DATA_LEN - pkt_head_space(pkt)); if (!pkt) return false; } data = (unsigned int *)pkt_push(pkt, VR_L2_MCAST_CTRL_DATA_LEN); if (!data) return false; *data = VR_L2_MCAST_CTRL_DATA; pkt->vp_type = VP_TYPE_L2; pkt->vp_flags |= VP_FLAG_MULTICAST; return true; }