// errorCEA sends an error answer indicating that the CER failed due to // an unsupported (acct/auth) application, and includes the AVP that // caused the failure in the message. func errorCEA(sm *StateMachine, c diam.Conn, m *diam.Message, cer *smparser.CER, failedAVP *diam.AVP) error { hostIP, _, err := net.SplitHostPort(c.LocalAddr().String()) if err != nil { return fmt.Errorf("failed to parse own ip %q: %s", c.LocalAddr(), err) } var a *diam.Message if failedAVP == cer.InbandSecurityID { a = m.Answer(diam.NoCommonSecurity) } else { a = m.Answer(diam.NoCommonApplication) } a.Header.CommandFlags |= diam.ErrorFlag a.NewAVP(avp.OriginHost, avp.Mbit, 0, sm.cfg.OriginHost) a.NewAVP(avp.OriginRealm, avp.Mbit, 0, sm.cfg.OriginRealm) a.NewAVP(avp.HostIPAddress, avp.Mbit, 0, datatype.Address(net.ParseIP(hostIP))) a.NewAVP(avp.VendorID, avp.Mbit, 0, sm.cfg.VendorID) a.NewAVP(avp.ProductName, 0, 0, sm.cfg.ProductName) if cer.OriginStateID != nil { a.AddAVP(cer.OriginStateID) } a.NewAVP(avp.FailedAVP, avp.Mbit, 0, &diam.GroupedAVP{ AVP: []*diam.AVP{failedAVP}, }) if sm.cfg.FirmwareRevision != 0 { a.NewAVP(avp.FirmwareRevision, avp.Mbit, 0, sm.cfg.FirmwareRevision) } _, err = a.WriteTo(c) return err }
// successCEA sends a success answer indicating that the CER was successfuly // parsed and accepted by the server. func successCEA(sm *StateMachine, c diam.Conn, m *diam.Message, cer *smparser.CER) error { hostIP, _, err := net.SplitHostPort(c.LocalAddr().String()) if err != nil { return fmt.Errorf("failed to parse own ip %q: %s", c.LocalAddr(), err) } a := m.Answer(diam.Success) a.NewAVP(avp.OriginHost, avp.Mbit, 0, sm.cfg.OriginHost) a.NewAVP(avp.OriginRealm, avp.Mbit, 0, sm.cfg.OriginRealm) a.NewAVP(avp.HostIPAddress, avp.Mbit, 0, datatype.Address(net.ParseIP(hostIP))) a.NewAVP(avp.VendorID, avp.Mbit, 0, sm.cfg.VendorID) a.NewAVP(avp.ProductName, 0, 0, sm.cfg.ProductName) if cer.OriginStateID != nil { a.AddAVP(cer.OriginStateID) } if cer.AcctApplicationID != nil { for _, acct := range cer.AcctApplicationID { a.AddAVP(acct) } } if cer.AuthApplicationID != nil { for _, auth := range cer.AuthApplicationID { a.AddAVP(auth) } } if cer.VendorSpecificApplicationID != nil { for _, vs := range cer.VendorSpecificApplicationID { a.AddAVP(vs) } } if sm.cfg.FirmwareRevision != 0 { a.NewAVP(avp.FirmwareRevision, avp.Mbit, 0, sm.cfg.FirmwareRevision) } _, err = a.WriteTo(c) return err }
func (cli *Client) makeCER(ip net.IP) *diam.Message { m := diam.NewRequest(diam.CapabilitiesExchange, 0, cli.Dict) m.NewAVP(avp.OriginHost, avp.Mbit, 0, cli.Handler.cfg.OriginHost) m.NewAVP(avp.OriginRealm, avp.Mbit, 0, cli.Handler.cfg.OriginRealm) m.NewAVP(avp.HostIPAddress, avp.Mbit, 0, datatype.Address(ip)) m.NewAVP(avp.VendorID, avp.Mbit, 0, cli.Handler.cfg.VendorID) m.NewAVP(avp.ProductName, 0, 0, cli.Handler.cfg.ProductName) stateid := datatype.Unsigned32(uint32(time.Now().Unix())) m.NewAVP(avp.OriginStateID, avp.Mbit, 0, stateid) if cli.SupportedVendorID != nil { for _, a := range cli.SupportedVendorID { m.AddAVP(a) } } if cli.AuthApplicationID != nil { for _, a := range cli.AuthApplicationID { m.AddAVP(a) } } m.NewAVP(avp.InbandSecurityID, avp.Mbit, 0, datatype.Unsigned32(0)) if cli.AcctApplicationID != nil { for _, a := range cli.AcctApplicationID { m.AddAVP(a) } } if cli.VendorSpecificApplicationID != nil { for _, a := range cli.VendorSpecificApplicationID { m.AddAVP(a) } } m.NewAVP(avp.FirmwareRevision, avp.Mbit, 0, cli.Handler.cfg.FirmwareRevision) return m }
func sendCEA(w io.Writer, m *diam.Message, OriginStateID, AcctApplicationID *diam.AVP) (n int64, err error) { m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.OctetString("srv")) m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.OctetString("localhost")) m.NewAVP(avp.HostIPAddress, avp.Mbit, 0, datatype.Address(net.ParseIP("127.0.0.1"))) m.NewAVP(avp.VendorID, avp.Mbit, 0, datatype.Unsigned32(99)) m.NewAVP(avp.ProductName, avp.Mbit, 0, datatype.UTF8String("go-diameter")) m.AddAVP(OriginStateID) m.AddAVP(AcctApplicationID) return m.WriteTo(w) }
func sendCER(w io.Writer) (n int64, err error) { m := diam.NewRequest(diam.CapabilitiesExchange, 0, nil) m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.OctetString("cli")) m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.OctetString("localhost")) m.NewAVP(avp.HostIPAddress, avp.Mbit, 0, datatype.Address(net.ParseIP("127.0.0.1"))) m.NewAVP(avp.VendorID, avp.Mbit, 0, datatype.Unsigned32(99)) m.NewAVP(avp.ProductName, avp.Mbit, 0, datatype.UTF8String("go-diameter")) m.NewAVP(avp.OriginStateID, avp.Mbit, 0, datatype.Unsigned32(1234)) m.NewAVP(avp.AcctApplicationID, avp.Mbit, 0, datatype.Unsigned32(1)) return m.WriteTo(w) }
func TestNewMessage(t *testing.T) { want, _ := ReadMessage(bytes.NewReader(testMessage), dict.Default) m := NewMessage(CapabilitiesExchange, RequestFlag, 0, 0xa8cc407d, 0xa8c1b2b4, dict.Default) m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("test")) m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("localhost")) m.NewAVP(avp.HostIPAddress, avp.Mbit, 0, datatype.Address(net.ParseIP("10.1.0.1"))) m.NewAVP(avp.VendorID, avp.Mbit, 0, datatype.Unsigned32(13)) m.NewAVP(avp.ProductName, 0, 0, datatype.UTF8String("go-diameter")) m.NewAVP(avp.OriginStateID, avp.Mbit, 0, datatype.Unsigned32(1397760650)) m.NewAVP(avp.SupportedVendorID, avp.Mbit, 0, datatype.Unsigned32(10415)) m.NewAVP(avp.SupportedVendorID, avp.Mbit, 0, datatype.Unsigned32(13)) m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4)) m.NewAVP(avp.InbandSecurityID, avp.Mbit, 0, datatype.Unsigned32(0)) m.NewAVP(avp.VendorSpecificApplicationID, avp.Mbit, 0, &GroupedAVP{ AVP: []*AVP{ NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4)), NewAVP(avp.VendorID, avp.Mbit, 0, datatype.Unsigned32(10415)), }, }) m.NewAVP(avp.FirmwareRevision, 0, 0, datatype.Unsigned32(1)) if m.Len() != want.Len() { t.Fatalf("Unexpected message length.\nWant: %d\n%s\nHave: %d\n%s", want.Len(), want, m.Len(), m) } a, err := m.Serialize() if err != nil { t.Fatal(err) } b, _ := want.Serialize() if !bytes.Equal(a, b) { t.Fatalf("Unexpected message.\nWant:\n%s\n%s\nHave:\n%s\n%s", want, hex.Dump(b), m, hex.Dump(a)) } t.Logf("%d bytes\n%s", len(a), m) t.Logf("Message:\n%s", hex.Dump(a)) }
var acctDictionary = `<?xml version="1.0" encoding="UTF-8"?> <diameter> <application id="1001" type="acct"> </application> </diameter> ` var authDictionary = `<?xml version="1.0" encoding="UTF-8"?> <diameter> <application id="1002" type="auth"> </application> </diameter> ` var ( localhostAddress = datatype.Address(net.ParseIP("127.0.0.1")) serverSettings = &Settings{ OriginHost: "srv", OriginRealm: "test", VendorID: 13, ProductName: "go-diameter", OriginStateID: datatype.Unsigned32(time.Now().Unix()), FirmwareRevision: 1, } clientSettings = &Settings{ OriginHost: "cli", OriginRealm: "test", VendorID: 13, ProductName: "go-diameter",