diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 4e8894cb44..2cea9971e6 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -2258,12 +2258,6 @@ static enum bgp_fsm_state_progress bgp_establish(struct peer *peer) peer, afi, safi, ORF_TYPE_PREFIX, REFRESH_IMMEDIATE, 0, BGP_ROUTE_REFRESH_NORMAL); - else if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) - bgp_route_refresh_send( - peer, afi, safi, ORF_TYPE_PREFIX_OLD, - REFRESH_IMMEDIATE, 0, - BGP_ROUTE_REFRESH_NORMAL); } } @@ -2272,9 +2266,7 @@ static enum bgp_fsm_state_progress bgp_establish(struct peer *peer) if (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)) if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_RCV) - || CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV)) + PEER_CAP_ORF_PREFIX_SM_RCV)) SET_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH); } diff --git a/bgpd/bgp_open.c b/bgpd/bgp_open.c index 84f770f7db..1b266314fb 100644 --- a/bgpd/bgp_open.c +++ b/bgpd/bgp_open.c @@ -36,7 +36,6 @@ static const struct message capcode_str[] = { {CAPABILITY_CODE_ADDPATH, "AddPath"}, {CAPABILITY_CODE_DYNAMIC, "Dynamic"}, {CAPABILITY_CODE_ENHE, "Extended Next Hop Encoding"}, - {CAPABILITY_CODE_ORF_OLD, "ORF (Old)"}, {CAPABILITY_CODE_FQDN, "FQDN"}, {CAPABILITY_CODE_ENHANCED_RR, "Enhanced Route Refresh"}, {CAPABILITY_CODE_EXT_MESSAGE, "BGP Extended Message"}, @@ -55,7 +54,6 @@ static const size_t cap_minsizes[] = { [CAPABILITY_CODE_ADDPATH] = CAPABILITY_CODE_ADDPATH_LEN, [CAPABILITY_CODE_DYNAMIC] = CAPABILITY_CODE_DYNAMIC_LEN, [CAPABILITY_CODE_ENHE] = CAPABILITY_CODE_ENHE_LEN, - [CAPABILITY_CODE_ORF_OLD] = CAPABILITY_CODE_ORF_LEN, [CAPABILITY_CODE_FQDN] = CAPABILITY_CODE_MIN_FQDN_LEN, [CAPABILITY_CODE_ENHANCED_RR] = CAPABILITY_CODE_ENHANCED_LEN, [CAPABILITY_CODE_EXT_MESSAGE] = CAPABILITY_CODE_EXT_MESSAGE_LEN, @@ -78,7 +76,6 @@ static const size_t cap_modsizes[] = { [CAPABILITY_CODE_ADDPATH] = 4, [CAPABILITY_CODE_DYNAMIC] = 1, [CAPABILITY_CODE_ENHE] = 6, - [CAPABILITY_CODE_ORF_OLD] = 1, [CAPABILITY_CODE_FQDN] = 1, [CAPABILITY_CODE_ENHANCED_RR] = 1, [CAPABILITY_CODE_EXT_MESSAGE] = 1, @@ -345,7 +342,6 @@ static void bgp_capability_orf_not_support(struct peer *peer, iana_afi_t afi, static const struct message orf_type_str[] = { {ORF_TYPE_RESERVED, "Reserved"}, {ORF_TYPE_PREFIX, "Prefixlist"}, - {ORF_TYPE_PREFIX_OLD, "Prefixlist (old)"}, {0}}; static const struct message orf_mode_str[] = {{ORF_MODE_RECEIVE, "Receive"}, @@ -434,22 +430,6 @@ static int bgp_capability_orf_entry(struct peer *peer, continue; } break; - case CAPABILITY_CODE_ORF_OLD: - switch (type) { - case ORF_TYPE_RESERVED: - if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%s Addr-family %d/%d has reserved ORF type, ignoring", - peer->host, afi, safi); - break; - case ORF_TYPE_PREFIX_OLD: - break; - default: - bgp_capability_orf_not_support( - peer, pkt_afi, pkt_safi, type, mode); - continue; - } - break; default: bgp_capability_orf_not_support(peer, pkt_afi, pkt_safi, type, mode); @@ -476,9 +456,6 @@ static int bgp_capability_orf_entry(struct peer *peer, if (hdr->code == CAPABILITY_CODE_ORF) { sm_cap = PEER_CAP_ORF_PREFIX_SM_RCV; rm_cap = PEER_CAP_ORF_PREFIX_RM_RCV; - } else if (hdr->code == CAPABILITY_CODE_ORF_OLD) { - sm_cap = PEER_CAP_ORF_PREFIX_SM_OLD_RCV; - rm_cap = PEER_CAP_ORF_PREFIX_RM_OLD_RCV; } else { bgp_capability_orf_not_support(peer, pkt_afi, pkt_safi, type, mode); @@ -1006,7 +983,6 @@ static int bgp_capability_parse(struct peer *peer, size_t length, case CAPABILITY_CODE_MP: case CAPABILITY_CODE_REFRESH: case CAPABILITY_CODE_ORF: - case CAPABILITY_CODE_ORF_OLD: case CAPABILITY_CODE_RESTART: case CAPABILITY_CODE_AS4: case CAPABILITY_CODE_ADDPATH: @@ -1076,7 +1052,6 @@ static int bgp_capability_parse(struct peer *peer, size_t length, SET_FLAG(peer->cap, PEER_CAP_REFRESH_RCV); } break; case CAPABILITY_CODE_ORF: - case CAPABILITY_CODE_ORF_OLD: ret = bgp_capability_orf_entry(peer, &caphdr); break; case CAPABILITY_CODE_RESTART: @@ -1486,9 +1461,7 @@ static void bgp_open_capability_orf(struct stream *s, struct peer *peer, /* Address Prefix ORF */ if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM) || CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM)) { - stream_putc(s, (code == CAPABILITY_CODE_ORF - ? ORF_TYPE_PREFIX - : ORF_TYPE_PREFIX_OLD)); + stream_putc(s, ORF_TYPE_PREFIX); if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM) @@ -1880,9 +1853,6 @@ uint16_t bgp_open_capability(struct stream *s, struct peer *peer, PEER_FLAG_ORF_PREFIX_SM) || CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM)) { - bgp_open_capability_orf(s, peer, afi, safi, - CAPABILITY_CODE_ORF_OLD, - ext_opt_params); bgp_open_capability_orf(s, peer, afi, safi, CAPABILITY_CODE_ORF, ext_opt_params); diff --git a/bgpd/bgp_open.h b/bgpd/bgp_open.h index c767100293..b18dbaa04f 100644 --- a/bgpd/bgp_open.h +++ b/bgpd/bgp_open.h @@ -38,7 +38,6 @@ struct graceful_restart_af { #define CAPABILITY_CODE_FQDN 73 /* Advertise hostname capability */ #define CAPABILITY_CODE_SOFT_VERSION 75 /* Software Version capability */ #define CAPABILITY_CODE_ENHE 5 /* Extended Next Hop Encoding */ -#define CAPABILITY_CODE_ORF_OLD 130 /* Cooperative Route Filtering Capability(cisco) */ #define CAPABILITY_CODE_EXT_MESSAGE 6 /* Extended Message Support */ #define CAPABILITY_CODE_ROLE 9 /* Role Capability */ @@ -63,7 +62,6 @@ struct graceful_restart_af { /* ORF Type */ #define ORF_TYPE_RESERVED 0 #define ORF_TYPE_PREFIX 64 -#define ORF_TYPE_PREFIX_OLD 128 /* ORF Mode */ #define ORF_MODE_RECEIVE 1 diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index d30ba68347..ab9e940997 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -1116,7 +1116,7 @@ void bgp_route_refresh_send(struct peer *peer, afi_t afi, safi_t safi, stream_putc(s, 0); stream_putc(s, pkt_safi); - if (orf_type == ORF_TYPE_PREFIX || orf_type == ORF_TYPE_PREFIX_OLD) + if (orf_type == ORF_TYPE_PREFIX) if (remove || filter->plist[FILTER_IN].plist) { uint16_t orf_len; unsigned long orfp; @@ -2375,8 +2375,7 @@ static int bgp_route_refresh_receive(struct peer *peer, bgp_size_t size) /* orf_len in bounds? */ if ((stream_pnt(s) + orf_len) > end) break; /* XXX: Notify instead?? */ - if (orf_type == ORF_TYPE_PREFIX - || orf_type == ORF_TYPE_PREFIX_OLD) { + if (orf_type == ORF_TYPE_PREFIX) { uint8_t *p_pnt = stream_pnt(s); uint8_t *p_end = stream_pnt(s) + orf_len; struct orf_prefix orfp; diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 0b821acfae..24be160656 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2181,10 +2181,8 @@ bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, } /* ORF prefix-list filter check */ - if (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV) - && (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV) - || CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV))) + if (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV) && + CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)) if (peer->orf_plist[afi][safi]) { if (prefix_list_apply(peer->orf_plist[afi][safi], p) == PREFIX_DENY) { diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c index 0fe6180bea..849f669932 100644 --- a/bgpd/bgp_updgrp.c +++ b/bgpd/bgp_updgrp.c @@ -420,8 +420,6 @@ static unsigned int updgrp_hash_key_make(const void *p) */ if (CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL) || CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV) - || CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV) || CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_OUT)) key = jhash_1word(jhash(peer->host, strlen(peer->host), SEED2), key); @@ -492,15 +490,12 @@ static unsigned int updgrp_hash_key_make(const void *p) : "(NONE)", peer->shared_network && peer_afi_active_nego(peer, AFI_IP6)); - zlog_debug( - "%pBP Update Group Hash: Lonesoul: %d ORF prefix: %u ORF old: %u max prefix out: %ju", - peer, !!CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL), - CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_RCV), - CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV), - (intmax_t)CHECK_FLAG(peer->af_flags[afi][safi], - PEER_FLAG_MAX_PREFIX_OUT)); + zlog_debug("%pBP Update Group Hash: Lonesoul: %d ORF prefix: %u max prefix out: %ju", + peer, !!CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL), + CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_SM_RCV), + (intmax_t)CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_MAX_PREFIX_OUT)); zlog_debug( "%pBP Update Group Hash: local role: %u AIGP: %d SOO: %s", peer, peer->local_role, @@ -637,11 +632,9 @@ static bool updgrp_hash_cmp(const void *p1, const void *p2) if ((afi == AFI_IP6) && (pe1->shared_network != pe2->shared_network)) return false; - if ((CHECK_FLAG(pe1->flags, PEER_FLAG_LONESOUL) - || CHECK_FLAG(pe1->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV) - || CHECK_FLAG(pe1->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV)) - && !sockunion_same(&pe1->su, &pe2->su)) + if ((CHECK_FLAG(pe1->flags, PEER_FLAG_LONESOUL) || + CHECK_FLAG(pe1->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)) && + !sockunion_same(&pe1->su, &pe2->su)) return false; return true; diff --git a/bgpd/bgp_updgrp.h b/bgpd/bgp_updgrp.h index 67c384ba02..70e7ac30b5 100644 --- a/bgpd/bgp_updgrp.h +++ b/bgpd/bgp_updgrp.h @@ -55,9 +55,8 @@ #define PEER_UPDGRP_CAP_FLAGS (PEER_CAP_AS4_RCV) #define PEER_UPDGRP_AF_CAP_FLAGS \ - (PEER_CAP_ORF_PREFIX_SM_RCV | PEER_CAP_ORF_PREFIX_SM_OLD_RCV \ - | PEER_CAP_ADDPATH_AF_TX_ADV | PEER_CAP_ADDPATH_AF_RX_RCV \ - | PEER_CAP_ENHE_AF_NEGO) + (PEER_CAP_ORF_PREFIX_SM_RCV | PEER_CAP_ADDPATH_AF_TX_ADV | \ + PEER_CAP_ADDPATH_AF_RX_RCV | PEER_CAP_ENHE_AF_NEGO) enum bpacket_attr_vec_type { BGP_ATTR_VEC_NH = 0, BGP_ATTR_VEC_MAX }; diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index cf74919e97..762b4ae44a 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -12659,7 +12659,6 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi, int orf_pfx_count; json_object *json_af = NULL; json_object *json_prefA = NULL; - json_object *json_prefB = NULL; json_object *json_addr = NULL; json_object *json_advmap = NULL; @@ -12702,37 +12701,13 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi, json_prefA); } - if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) { - json_object_int_add(json_af, "orfOldType", - ORF_TYPE_PREFIX_OLD); - json_prefB = json_object_new_object(); - bgp_show_peer_afi_orf_cap( - vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV, - PEER_CAP_ORF_PREFIX_RM_ADV, - PEER_CAP_ORF_PREFIX_SM_OLD_RCV, - PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, - json_prefB); - json_object_object_add(json_af, "orfOldPrefixList", - json_prefB); - } - - if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) + if (CHECK_FLAG(p->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_SM_ADV) || + CHECK_FLAG(p->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_SM_RCV) || + CHECK_FLAG(p->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_RM_ADV) || + CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)) json_object_object_add(json_addr, "afDependentCap", json_af); else @@ -13019,17 +12994,13 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi, } else { vty_out(vty, " Not part of any update group\n"); } - if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) + if (CHECK_FLAG(p->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_SM_ADV) || + CHECK_FLAG(p->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_SM_RCV) || + CHECK_FLAG(p->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_RM_ADV) || + CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)) vty_out(vty, " AF-dependant capabilities:\n"); if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV) @@ -13048,22 +13019,6 @@ static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi, PEER_CAP_ORF_PREFIX_SM_RCV, PEER_CAP_ORF_PREFIX_RM_RCV, use_json, NULL); } - if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_OLD_RCV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_ADV) - || CHECK_FLAG(p->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) { - vty_out(vty, - " Outbound Route Filter (ORF) type (%d) Prefix-list:\n", - ORF_TYPE_PREFIX_OLD); - bgp_show_peer_afi_orf_cap( - vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV, - PEER_CAP_ORF_PREFIX_RM_ADV, - PEER_CAP_ORF_PREFIX_SM_OLD_RCV, - PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, NULL); - } snprintf(orf_pfx_name, sizeof(orf_pfx_name), "%s.%d.%d", p->host, afi, safi); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 5544c59df8..5c97f90c55 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -6964,11 +6964,8 @@ static void peer_prefix_list_update(struct prefix_list *plist) */ if (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV) && - (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_RCV) || - CHECK_FLAG( - peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV))) + CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_RM_RCV)) peer_clear_soft( peer, afi, safi, BGP_CLEAR_SOFT_IN_ORF_PREFIX); @@ -7935,19 +7932,15 @@ int peer_clear_soft(struct peer *peer, afi_t afi, safi_t safi, if (stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX) { if (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_SM_ADV) - && (CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_RCV) - || CHECK_FLAG(peer->af_cap[afi][safi], - PEER_CAP_ORF_PREFIX_RM_OLD_RCV))) { + PEER_CAP_ORF_PREFIX_SM_ADV) && + CHECK_FLAG(peer->af_cap[afi][safi], + PEER_CAP_ORF_PREFIX_RM_RCV)) { struct bgp_filter *filter = &peer->filter[afi][safi]; uint8_t prefix_type; if (CHECK_FLAG(peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)) prefix_type = ORF_TYPE_PREFIX; - else - prefix_type = ORF_TYPE_PREFIX_OLD; if (filter->plist[FILTER_IN].plist) { if (CHECK_FLAG(peer->af_sflags[afi][safi], diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index b8208cecee..edf9234424 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1280,8 +1280,6 @@ struct peer { #define PEER_CAP_ORF_PREFIX_RM_ADV (1U << 1) /* receive-mode advertised */ #define PEER_CAP_ORF_PREFIX_SM_RCV (1U << 2) /* send-mode received */ #define PEER_CAP_ORF_PREFIX_RM_RCV (1U << 3) /* receive-mode received */ -#define PEER_CAP_ORF_PREFIX_SM_OLD_RCV (1U << 4) /* send-mode received */ -#define PEER_CAP_ORF_PREFIX_RM_OLD_RCV (1U << 5) /* receive-mode received */ #define PEER_CAP_RESTART_AF_RCV (1U << 6) /* graceful restart afi/safi received */ #define PEER_CAP_RESTART_AF_PRESERVE_RCV (1U << 7) /* graceful restart afi/safi F-bit received */ #define PEER_CAP_ADDPATH_AF_TX_ADV (1U << 8) /* addpath tx advertised */