1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package layers
- import (
- "encoding/binary"
- "errors"
- "github.com/google/gopacket"
- )
- type PPP struct {
- BaseLayer
- PPPType PPPType
- }
- var PPPEndpoint = gopacket.NewEndpoint(EndpointPPP, nil)
- var PPPFlow = gopacket.NewFlow(EndpointPPP, nil, nil)
- func (p *PPP) LayerType() gopacket.LayerType { return LayerTypePPP }
- func (p *PPP) LinkFlow() gopacket.Flow { return PPPFlow }
- func decodePPP(data []byte, p gopacket.PacketBuilder) error {
- ppp := &PPP{}
- if data[0]&0x1 == 0 {
- if data[1]&0x1 == 0 {
- return errors.New("PPP has invalid type")
- }
- ppp.PPPType = PPPType(binary.BigEndian.Uint16(data[:2]))
- ppp.Contents = data[:2]
- ppp.Payload = data[2:]
- } else {
- ppp.PPPType = PPPType(data[0])
- ppp.Contents = data[:1]
- ppp.Payload = data[1:]
- }
- p.AddLayer(ppp)
- p.SetLinkLayer(ppp)
- return p.NextDecoder(ppp.PPPType)
- }
- func (p *PPP) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error {
- if p.PPPType&0x100 == 0 {
- bytes, err := b.PrependBytes(2)
- if err != nil {
- return err
- }
- binary.BigEndian.PutUint16(bytes, uint16(p.PPPType))
- } else {
- bytes, err := b.PrependBytes(1)
- if err != nil {
- return err
- }
- bytes[0] = uint8(p.PPPType)
- }
- return nil
- }
|