/*Unshim removes the shim layer from an IPv4 packet, if it's present.*/ func Unshim(ipLayer *layers.IPv4) *RouteRecord { if Shimmed(ipLayer) { /*Remove the route record from the payload*/ ipPayload := bytes.NewBuffer(ipLayer.LayerPayload()) var rr RouteRecord rr.ReadFrom(ipPayload) ipLayer.Length -= uint16(rr.Len()) ipLayer.Protocol = layers.IPProtocol(rr.Protocol) ipLayer.Checksum = 0 ipLayer.Payload = ipPayload.Bytes() return &rr } return nil }
/*Shim inserts the given router into the shim layer route record of the given IPv4 packet, creating a new route record if it's not already present.*/ func Shim(ipLayer *layers.IPv4, r Router) { ipPayload := bytes.NewBuffer(ipLayer.LayerPayload()) var modifiedIPPayload bytes.Buffer var rr RouteRecord if Shimmed(ipLayer) { rr.ReadFrom(ipPayload) ipLayer.Length -= uint16(rr.Len()) } else { rr.Protocol = uint8(ipLayer.Protocol) } /*Add the specified router to the route record and put the record at the beginning of the payload.*/ rr.AddRouter(r) rr.WriteTo(&modifiedIPPayload) ipPayload.WriteTo(&modifiedIPPayload) ipLayer.Length += uint16(rr.Len()) ipLayer.Protocol = layers.IPProtocol(IPProtocolAITFRouteRecord) ipLayer.Checksum = 0 ipLayer.Payload = modifiedIPPayload.Bytes() }